Java - 接口和方法

时间:2012-04-19 00:29:16

标签: java interface methods

我正在浏览一些界面,我想知道为什么这不起作用:

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

基本上,为什么我不能在界面中实现该方法?有一个返回类型有不同的签名吗?是不是名称,参数和返回类型使方法独特?

4 个答案:

答案 0 :(得分: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!
}

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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?