作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请查看以下代码:
abstract class Shape {
protected double x;
protected double y;
public Shape(double x, double y) {
this.x = x;
this.y = y;
}
abstract protected void draw();
}
class Circle extends Shape {
public Circle(double x, double y, double r) {
super(x, y);
this.r = r;
}
protected double r;
protected void draw() {
System.out.println(String.format("Draw Circle. %f %f %f", x, y ,r));
}
}
class RenderEngine {
public static void draw1(Shape s) {
s.draw();
}
public static <T extends Shape> void draw2(T t) {
t.draw();
}
}
public class Runner {
@Test
public void run() {
Circle c = new Circle(1,2,3);
RenderEngine.draw1(c);
RenderEngine.draw2(c);
}
}
draw1()和draw2()有什么区别?哪一个更好? draw2()有更多的可扩展性吗?或者draw2()有更好的性能吗?
最佳答案
您的场景没有区别,因为正在绘制的对象的类型是在 drawX
方法内部使用的。
如果您的方法在其他上下文中使用 T
,例如将原始数据返回给调用者,则会产生影响:
public static <T extends Shape> T draw2(T t) {
t.draw();
return t;
}
当子类在基类之上定义新方法时,这会产生不同的情况。例如,如果定义了Circle
double radius() { return r;}
您可以执行以下操作:
double r = RenderEngine.draw1(c).radius();
如果实现返回 Shape
,这是不可能的。
注意:以上内容是为了演示差异,而不是表明新的实现比原始实现更可取。
关于java - 使用泛型参数比使用基类参数有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42406070/
我是一名优秀的程序员,十分优秀!