【问题标题】:Java - Interfaces and methodsJava - 接口和方法
【发布时间】:2012-04-19 00:29:16
【问题描述】:
我现在正在浏览一些界面,我想知道为什么这不起作用:
interface I {
public void doSomething(String x);
}
class MyType implements I {
public int doSomething(String x) {
System.out.println(x);
return(0);
}
}
基本上,为什么我不能实现接口中的方法?他们有不同的签名,因为一个有返回类型?名称、参数和返回类型难道不是使方法独一无二的吗?
【问题讨论】:
标签:
java
interface
methods
【解决方案1】:
您不能有不同的返回类型。想象一下
class Foo implements I {
public int doSomething(String x) {
System.out.println(x);
return(0);
}
}
class Bar implements I {
public void doSomething(String x) {
System.out.println(x);
return;
}
}
List<I> l = new ArrayList();
l.add(new Foo());
l.add(new Bar());
for (I i : l) {
int x = i.doSomething(); // this makes no sense for Bar!
}
因此,返回类型也必须相同!
【解决方案2】:
是的,你基本上是正确的。 Java 不允许通过返回类型重载方法,这很整洁。但是,接口返回类型仍然必须匹配。
【解决方案3】:
方法签名由方法的名称和参数类型组成,因此您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器不能把它们区分开来。
【解决方案4】:
想想接口的典型用途:例如任何实现java List 接口的东西都必须实现boolean add(Object o)
调用者可能会执行以下操作:
if (!impl.add(o)) { /* report error */ }
如果允许您更改返回类型,您会遇到所有类型的问题。
void add(Object o)
if (!impl.add(o)) { // ... your method returns void, so this makes no sense
float add(Object o)
if (!impl.add(o)) { // float to boolean ? are you sure that is what you meant?