繁体   English   中英

Java-对于给定的函数foo(X i); 在接口X中,为什么不能实现类Y将其更改为foo(Y i)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM