代码之家  ›  专栏  ›  技术社区  ›  Cam

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

  •  0
  • Cam  · 技术社区  · 14 年前

    例如

    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中的参数类型?

    6 回复  |  直到 14 年前
        1
  •  4
  •   Esko    14 年前

    除了波义耳所说的,你不能在不暗示编者意图的情况下改变它。通过将泛型引入接口,可以做到这一点,比如:

    public interface X<T> {
        public void foo(T i);
    }
    
    public class Y implements X<Y> {
        public void foo(Y i){
            fooBar(foo);
        }
    }
    
        2
  •  4
  •   Dónal Boyle    14 年前

    通过更改类Y中输入参数的类型,您已经更改了方法的签名,这意味着编译器将其视为完全不同的方法。

    Java接口就像一个合同。任何实现它的东西 必须 实现它定义的确切方法。通过使用不同的方法签名,您没有真正实现定义的方法,因此您违反了该约定。

        3
  •  2
  •   Steven Schlansker    14 年前

    尝试一下

    interface X<T extends X> {
        public void foo(T a);
    }
    
    class Y implements X<Y> {
        public void foo(Y a);
    }
    
        4
  •  1
  •   Carl Manaster    14 年前

    假设你已经做了你想做的事情,假设Java允许它。让我们假设另一个类,称之为z,也实现了x。因为z实现了x,而且由于x的定义,你必须能够为任何z调用x.foo(z)。但是,如果你将z传递给它的foo(),y(x)不知道该怎么做。这就是为什么。

        5
  •  0
  •   FRotthowe    14 年前

    通过实现接口X,您保证在此接口上实现所有方法,这意味着您的foo方法可以采用任意X。 现在,如果您只接受ys作为foo方法的参数,那么就不会完全实现接口,因为实现x的所有其他类都不是foo的有效参数。

        6
  •  0
  •   kane77    14 年前

    因为接口为所有实现类指定了公共行为。假设您有一些其他的类,所有实现X,您会期望如果您有类X的对象,您可以用类X的参数(可以是它的任何子类或实现)调用foo,那么让我们假设您有这样的代码:

    class Z implements X {
      ...
    }
    
    Z z = new Z();
    X x = new Y();
    x.foo(z);
    

    这将是错误的,因为对于代码,foo只接受类y的参数