例如
public interface X{
public void foo(X i);
}
public class Y implements X{//error: doesn't implement foo(X i)...
public void foo(Y i){
fooBar(foo);
}
....
}
为什么我不能这样做?我怎样才能改变它以便这样做?如何用X参数在X中声明foo,然后能够在Y中使用Y作为参数类型?
答案 0 :(得分:4)
通过更改类Y中输入参数的类型,您已经更改了方法的签名,这意味着编译器将其视为完全不同的方法。
Java接口就像合同。任何实现它的东西必须实现它定义的确切方法。通过使用不同的方法签名,您实际上并没有实现已定义的方法,因此您违反了该合同。
答案 1 :(得分:4)
除了Don Boyle所说的,你不能在不暗示编译意图的情况下改变它。您可以通过将Generics引入接口来实现此目的,如下所示:
public interface X<T> {
public void foo(T i);
}
public class Y implements X<Y> {
public void foo(Y i){
fooBar(foo);
}
}
答案 2 :(得分:2)
尝试类似
的内容interface X<T extends X> {
public void foo(T a);
}
class Y implements X<Y> {
public void foo(Y a);
}
答案 3 :(得分:1)
假设您已按要求完成,并假设Java允许它。让我们说另一个类 - 称之为Z - 也实现X.因为Z实现了X,并且由于X的定义,你必须能够为任何Z z调用X.foo(z)。但是Y,这是一个X,如果你将Z传递给它的foo(),它不知道该怎么办。这就是原因。
答案 4 :(得分:0)
通过实现接口X,您承诺在此接口上实现所有方法,这意味着您的foo方法可以采用任意X. 现在,如果您只接受Ys作为foo方法的参数,则不会完全实现该接口,因为实现X的所有其他类都不是foo的有效参数。
答案 5 :(得分:0)
因为Interface指定了所有实现类的通用行为。假设你有一些其他类都在实现X你会期望如果你有X类的对象你可以用类X的参数调用foo(可以是它的任何子类或实现)所以让我们说你' d有这样的代码:
class Z implements X {
...
}
Z z = new Z();
X x = new Y();
x.foo(z);
这将是错误的,因为你的代码foo只会接受Y类的参数