在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类中的方法。