[英]Difference between void foo(T y) and <T> void foo(T y) in Java generic class
[英]Java - For a given function foo(X i); in Interface X, why can't implementing class Y change it to foo(Y i)?
例如
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中使用参数声明foo,然后可以将Y用作Y中的参数类型?
通过更改类Y中的输入参数的类型,可以更改方法的签名,这意味着编译器将其视为完全不同的方法。
Java接口就像合同。 任何实现它的方法都必须实现它定义的确切方法。 通过使用不同的方法签名,您实际上并没有实现已定义的方法,因此您正在违反该合同。
除了Don Boyle所说的之外,您不能在不暗示编译器意图的情况下对其进行更改。 您可以通过向接口引入泛型来实现此目的,如下所示:
public interface X<T> {
public void foo(T i);
}
public class Y implements X<Y> {
public void foo(Y i){
fooBar(foo);
}
}
尝试类似
interface X<T extends X> {
public void foo(T a);
}
class Y implements X<Y> {
public void foo(Y a);
}
假设您已按需完成,并假设Java允许。 假设另一个类-称为Z-也实现X。由于Z实现X,并且由于X的定义,您必须能够为任何Z z调用X.foo(z)。 但是Y(它是X)不知道将Z传递给它的foo()时该怎么办。 这就是为什么。
通过实现接口X,您可以保证在该接口上实现所有方法,这意味着foo方法可以采用任意X。现在,如果仅接受Ys作为foo方法的参数,则不会完全实现接口,因为其他所有实现X的类都不是foo的有效参数。
因为Interface为所有实现类指定了通用行为。 假设您还有其他一些都实现X的类,那么您会期望,如果您拥有类X的对象,则可以使用类X(可以是其子类或实现中的任何一个)的参数来调用foo,那么假设您是d具有如下代码:
class Z implements X {
...
}
Z z = new Z();
X x = new Y();
x.foo(z);
这将是错误的,因为使用您的代码foo将仅接受类Y的参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.