class Shape {
public void Draw() {
System.out.println("Draw Shape");
}
}
class Rect extends Shape {
@Override
public void Draw() {
System.out.println("Draw Rect");
}
}
class Line extends Shape {
@Override
public void Draw() {
System.out.println("Draw Line");
}
}
class Drawer {
public void DrawShape(T shape) {
shape.Draw();
}
}
Drawer是一个泛型类,DrawShape方法绘制一个图形,从使用C++模板的经验来看,这绝对是正确的,但Java居然出现编译错误了:shape.Draw这样调用不被允许。
我再把代码修改了一下:
class Drawer {
public void DrawShape(T shape) {
shape.toString();
}
}
这样就编译通过了,看来Java是把 T 解释成 Object 了,有没有办法让它解释成Shape呢,又看了一下文档,才知道要这样写:
class Drawer {
public void DrawShape(T shape) {
shape.Draw();
}
}
原来类型参加也可以指定继承的,如果是这样,那和不用泛型的代码有什么区别呢: class Drawer {
public void DrawShape(Shape shape) {
shape.Draw();
}
}
看来Java的泛型和C++的模板有很大的区别,Java的泛型更多的是用于容器,并且在我看来,它的最大作用是省去类型转换的操作,并且在编译期检查一下类型是否正确,传统容器类可能要这样写:
List intList = new ArrayList();
intList.add(new Integer(10));
Integer i = (Integer)intList.get(0);
有了泛型以后可以改成这样写:
List intList = new ArrayList();
intList.add(new Integer(10));
Integer i = intList.get(0);
网友评论