在Java lambda expr中使用多態性時,我發現了一個有趣的行爲。我希望有人能對此有所瞭解。Java中的有趣行爲Lambda表達式的多態性
假設以下的事情:
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,我們得到的輸出
乙
我們知道, 「一」 是指B的參考在運行時,所以它打印「B」 但是,當我們改變B類的方法類型如下
class B extends A
{
void meth(Y y)
{
System.out.println("B");
}
}
如果運行Java8Test.main,我們得到的輸出
一個
我們知道, 「一」 是指B的在運行時的參考,但怎麼來它打印 「A」這次 ??
1.你認爲lamda簽名與B類meth()相匹配嗎? 2.此外,B的參考是在運行時不是A – SaK
這只是表明你應該總是使用@Override: http://docs.oracle.com/javase/jp/8/api/java/lang/Override html的 –