关于Java中协变参数的问题

问题描述 投票:0回答:1

我有这段代码:

class X {
    int x = 1;
}

class Y extends X {
    int y = 2;
}

class Z extends Y {
    int z = 3;
}


class A {
    public Y metodo1(Y y) {
        System.out.println("Metodo1 de A");
        return new Y();
    }

    public Y metodo2(Y y) {
        System.out.println("Metodo2 de A");
        return new Y();
    }
}

class B extends A {
    public X metodo1(Y y) {
        System.out.println("Metodo1 de B");
        return new X();
    }

    public Z metodo2(Y y) {
        System.out.println("Metodo2 de B");
        return new Z();
    }

    public void metodo3() {
        System.out.println("Metodo3 de B");
    }
}

class C extends A{
    public Y metodo1(X x) {
        System.out.println("Metodo1 de C");
        return new Y();
    }

    public Y metodo2(Z z) {
        System.out.println("Metodo2 de C");
        return new Z();
    }

    public void metodo3() {
        System.out.println("Metodo3 de C");
    }
}

public class DynamicBinding {
    public static void main(String[] args) {
        A b = new B();
        A c = new C();
        C c1 = new C();

        X x1 = b.metodo1(new Y());
        X x2 = b.metodo2(new Y());
        b.metodo3();

        X x3 = c.metodo1(new X());
        X x4 = c.metodo2(new Z());
        c.metodo3();

        X x5 = c1.metodo1(new Y());
        X x6 = c1.metodo1(new X());
    }
}

我知道有一些错误,例如]中的协变量返回类型>

public X metodo1(Y y) {
      System.out.println("Metodo1 de B");
      return new X();
} 

或那个b.metodo3();不存在,但是我的问题是关于这个:

X x5 = c1.metodo1(new Y());
X x6 = c1.metodo1(new X());

Eclipse不会向我显示任何错误,但是我认为它们具有协变参数,而Java中是不允许的。我想念什么? (也许在X x5 = c1.metodo1(new Y());中它称为A的metodo1,但我不理解另一个)。

谢谢!

我有这段代码:class X {int x = 1; }类Y扩展X {int y = 2; } Z类扩展Y {int z = 3; } A类{公共Y metodo1(Y y){System.out.println(“ ...

java covariance covariant
1个回答
0
投票

子类中的方法不允许破坏超类中的签名,因此假设您具有

© www.soinside.com 2019 - 2024. All rights reserved.