我在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
我们知道" a"是指B在运行时的参考但是如何打印" A"这个时候??
答案 0 :(得分:3)
lambda表达式是一个红鲱鱼。当您更改B类中的方法签名时,它不再覆盖
void meth(X x)
A类中的方法。
答案 1 :(得分:1)
在这两种情况下,都会调用
meth()
类B
类。
在第一种情况下,调用重写 meth()
,在第二种情况下调用继承 meth()
。
在您延长A
课程时,meth(X x)
方法将从父级继承而meth(X x)
和meth(Y y)
在子级B
级中存在两种不同的方法
PS:lambda表达式的类型为目标类型。
了解lambda类型的有用文章:
答案 2 :(得分:0)
这似乎与如何使用lambda表达式解决重载方法有关 这是一个有点类似的问题,有一个非常详细的答案:Java8: ambiguity with lambdas and overloaded methods
答案 3 :(得分:0)
我认为会发生以下情况。实施时:
void meth(Y y) {
System.out.println("B");
}
按类B
,此方法不会覆盖:
void meth(X x) {
System.out.println("A");
}
A类的但变量:
A a = new B();
的类型为A
,因此声明为:
a.meth((z) -> System.out.println());
会引用A
方法,因此会打印 A 。