我必须承认我不是一个Java程序员,日常开发主要是C++和Delphi,使用Java完全是为了开发Android应用。今天在看Java的泛型,有些方面感到很奇怪,先来看下面的代码:
public void Draw() {
System.out.println("Draw Shape");
}
}
@Override
public void Draw() {
System.out.println("Draw Rect");
}
}
@Override
public void Draw() {
System.out.println("Draw Line");
}
}
public void DrawShape(T shape) {
shape.Draw();
}
}
我再把代码修改了一下:
public void DrawShape(T shape) {
shape.toString();
}
}
public void DrawShape(T shape) {
shape.Draw();
}
}
原来类型参加也可以指定继承的,如果是这样,那和不用泛型的代码有什么区别呢:
class Drawer {
public void DrawShape(Shape shape) {
shape.Draw();
}
}
intList.add(new Integer(10));
Integer i = (Integer)intList.get(0);
intList.add(new Integer(10));
Integer i = intList.get(0);
for (Object o: list) {
System.out.println(o.toString());
}
}
List<Rect> intList = new ArrayList<Rect>();
intList.add(new Rect());
intList.add(new Rect());
intList.add(new Rect());
PrintList(intList);
}
for (Object o: list) {
System.out.println(o.toString());
}
}
public String getName() {
return "Shape";
}
}
@Override
public String getName() {
return "Rect";
}
}
for (Shape s: list) {
System.out.println(s.getName());
}
}
List<Rect> intList = new ArrayList<Rect>();
intList.add(new Rect());
intList.add(new Rect());
intList.add(new Rect());
PrintList(intList);
}
}
但这个用法又带来了一些限制,就是List<? extends Shape> list中的list是不能增加删除元素的,比如:
for (Shape s: list) {
System.out.println(s.getName());
}
list.add(new Line());
}
个人觉得Java不要泛型的好,因为没有一定要用它的理由啊,它只可以帮你自动转换和检查一下类型,但它所带来的语法复杂性,其实是得不偿失的。