Java Lambda表达式在多态中的有趣行为

时间:2014-05-14 09:16:53

标签: java lambda polymorphism

我在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"这个时候??

4 个答案:

答案 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类型的有用文章:

  1. Target typing
  2. Java 8 Lambda expressions

答案 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