在Java lambda expr中使用多态时,我发现了一个有趣的行为。
我希望有人能对此有所启发。

假设以下内容:

public class Java8Test {
    public static void main(String[] args) {
        A a  = new B();
        a.meth((z) -> System.out.println() );
    }
}

interface X
{
    void meth(int a);
}

interface Y
{
    void meth(int a);
}

class A
{
    void meth(X x)
    {
        System.out.println("A");
    }

}

class B extends A
{
    void meth(X x)
    {
        System.out.println("B");
    }
}


如果运行Java8Test.main,则输出为


  乙


我们知道“ a”是在运行时引用B的引用,因此它会打印“ B”
但是,当我们如下更改类B中的方法类型时

    class B extends A
{
    void meth(Y y)
    {
        System.out.println("B");
    }
}


如果运行Java8Test.main,则输出为


  一种


我们知道“ a”是在运行时BUT引用B的引用,这次它为什么会打印“ A”?

最佳答案

Lambda表达式是红色鲱鱼。当您在类B中更改方法签名时,它不再覆盖

void meth(X x)


A类中的方法。

09-25 21:56