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);