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是一個(gè)泛型類,DrawShape方法繪制一個(gè)圖形,從使用C++模板的經(jīng)驗(yàn)來(lái)看,這絕對(duì)是正確的,但Java居然出現(xiàn)編譯錯(cuò)誤了:shape.Draw這樣調(diào)用不被允許。
我再把代碼修改了一下:
class Drawer {
public void DrawShape(T shape) {
shape.toString();
}
}
這樣就編譯通過(guò)了,看來(lái)Java是把 T 解釋成 Object 了,有沒(méi)有辦法讓它解釋成Shape呢,又看了一下文檔,才知道要這樣寫:
class Drawer {
public void DrawShape(T shape) {
shape.Draw();
}
}
原來(lái)類型參加也可以指定繼承的,如果是這樣,那和不用泛型的代碼有什么區(qū)別呢: class Drawer {
public void DrawShape(Shape shape) {
shape.Draw();
}
}
看來(lái)Java的泛型和C++的模板有很大的區(qū)別,Java的泛型更多的是用于容器,并且在我看來(lái),它的最大作用是省去類型轉(zhuǎn)換的操作,并且在編譯期檢查一下類型是否正確,傳統(tǒng)容器類可能要這樣寫:
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);