0

我目前正在查看一些界面,我想知道为什么这不起作用:

interface I {
    public void doSomething(String x);
}
class MyType implements I {
    public int doSomething(String x) {
        System.out.println(x);
        return(0); 
    }
}

基本上,为什么我不能在接口中实现方法?他们有不同的签名,因为一个有返回类型?名称、参数和返回类型难道不是使方法独一无二的吗?

4

4 回答 4

7

您不能有不同的返回类型。想象以下

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!
}

因此,返回类型也必须相同!

于 2012-04-19T00:36:20.710 回答
2

是的,你基本上是对的。Java 不允许通过返回类型重载方法,这很整洁。但是,接口返回类型仍然必须匹配。

于 2012-04-19T00:32:47.197 回答
1

方法签名由方法的名称和参数类型组成,因此您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器无法区分它们。

于 2012-04-19T00:37:34.207 回答
0

想想接口的典型用途:例如,任何实现 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?
于 2012-04-19T00:37:33.613 回答