如果泛型计算为编译时,为什么这不起作用?



假设我有 2 个这样的类:

public class Circle {
private int area;
public Circle(int a) {
area = a;
}
public int getArea() {
System.out.println("Circle::getArea");
return area;
}
}
public class Square {
private int area;
public Square(int a) {
area = a;
}
public int getArea() {
System.out.println("Square::getArea");
return area;
}
}

我想写一些类似的东西

public static <T> int genericArea(T shape) {
return shape.getArea();
}

但这失败了error: cannot find symbol

我的理解是,由于泛型是在编译时解决的,因此它应该能够验证该方法的所有用法是否都与 Square 或 Circle 类一起使用。

在这里摆弄:https://repl.it/repls/InnocentDarkmagentaDifferences

请注意,我知道如何使用接口来做到这一点,但是: 1. 我很好奇 2.在我尝试解决的特定问题中,我无法修改圆形和方形,因为它们是由其他系统自动生成

C++使用模板;它为每次使用创建一个单独的genericArea副本(最初,在生成的源代码中(。这意味着您可以使用任何具有getArea()的类型。

Java 改用泛型;genericArea方法只有一个副本,它可以处理与其类型参数匹配的任何内容。但是你的类型参数本质上只是Object,因为你没有将其限制为类似T extends HasArea的东西,也没有Object.getArea()

最新更新