gpt4 book ai didi

java - lambda 表达式可以替代多态性吗?

转载 作者:IT老高 更新时间:2023-10-28 20:23:28 24 4
gpt4 key购买 nike

我正在学习 lambda 表达式和函数式接口(interface)。我们可以通过 lambda 表达式直接编写接口(interface)的实现。所以我认为,它可能是多态性的替代方案。

我有一些使用多态的代码,

interface Drawable {
public void draw();
}


class Shape {

protected String name;

public Shape(String name) {
this.name = name;
}
}

class Rectangle extends Shape implements Drawable {

public Rectangle(String name) {
super(name);
}

@Override
public void draw() {
System.out.println("I am "+this.name);
System.out.println("Drawing rectangle with 2 equal sides.");
}
}

class Square extends Shape implements Drawable {

public Square(String name) {
super(name);
}

@Override
public void draw() {
System.out.println("I am "+this.name);
System.out.println("Drawing square with 4 equal sides.");
}
}


public class DrawShape {

public static void main(String ar[]) {

Drawable rectangle = new Rectangle("Rectangle");
rectangle.draw();

Drawable square = new Square("Square");
square.draw();

}
}

我已经使用 lambda 表达式和函数式接口(interface)编写了上面的代码,

@FunctionalInterface
interface Drawable {
public void draw();
}


class Shape {
private String name;
public Shape(String name) {
this.name = name;
}

public void draw(Drawable d1) {
System.out.println("I am "+this.name);
d1.draw();
}
}



public class DrawShape {

public static void main(String[] args) {
Shape s1 = new Shape("Rectangle");
Drawable rectangle = () -> System.out.println("Drawing rectangle with 2 equal sides.");
s1.draw(rectangle);

Shape s2 = new Shape("Square");
Drawable sqaure = () -> System.out.println("Drawing square with 4 equal sides.");
s2.draw(sqaure);
}

}

哪种方法更好?lambda的代码复用性、代码维护和修改、耦合和内聚等其他方面呢?

最佳答案

我认为 lambda 表达式允许开发人员编写完全多态的类型,就像完整的类实现一样。

多态性通常以两种方式出现:

Drawable drawable = new Rectangle("name");
drawable.draw();
Shape shape = (Shape) drawable; //same object, multiple types.

还有:

Drawable drawable2 = new Rectangle("name");
drawable2.draw(); //Rectangle.draw() implementation invoked
drawable2 = new Square("name");
drawable2.draw(); //Square.draw() implementation

这两者都不能完全被 lambda 表达式所允许:

  1. Lambda 表达式仅用于实现函数式接口(interface)。这是第一个主要限制。
  2. 虽然可以这样做:

    Drawable drawable = () -> System.out.println("drawing rectangle");
    drawable = () -> System.out.println("drawing square");

    这与上面的第二个代码片段并不完全相同(在更复杂的示例中,可以在 Shape 中提供基本实现,并在 中覆盖它RectangleSquare; 而这对于 lambdas 是不可能的)。此外,有人认为上述两个分配使用不同的源代码是正确的。

  3. 不能像使用类一样“转换”类型:

    Drawable drawable3 = () -> System.out.println("Drawing something");
    Shape shape3 = (Shape) drawable3; //Class cast exception.

换句话说,lambda 表达式非常适合函数式编程编码,不是良好的面向对象设计的替代品。

关于java - lambda 表达式可以替代多态性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51605649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com