【IT168 文档】本来jdk5之前有java.util.List这个Interface是这么用的:
myIntList.add(new Integer(0));
Integer x = (Integer)myIntList.iterator().next();
这里myIntList其实可以myIntList.add(new Object());因为声明语句就没有写出该List到底支持什么。所以myIntList.iterator().next()返回的只能是Object,它并不知道这里面装的到底是什么具体的类。
因为这个List里既可能有Integer对象,也可能有Double对象,为了不要(Integer)这个强制转换,我们有了这个:
这个时候,Integer x = (Integer)myIntList.iterator().next();就可以去掉强制转换写成
因为编译器确实知道了myIntList里放的就是Integer,不会是其他。这个地方要注意:List
List<Integer> myIntList = new LinkedList(); //警告,不出错 myIntList只能add(Integer)
List<Integer> myIntList = new LinkedList<Double>(); // 出错
事情到这里,看似所有问题都解决了,但是不尽然。慢慢道来:
public void say();
};
class Circle extends {
public void say() {
System.out.println("i am a circle");
}
};
通过上面,我们可以
shape.say(); // i am a circle.
这里表明,父类可以代表子类。但是,List
for(Shape s : list) {
s.say();
}
}
那么这个函数不能被这样调用:
sayAll(circleList);
只能被这样调用:
sayAll(shapeList);
##这里详细解释为什么List
List<Shape> shapeList = circleList;
shapeList.add(new Shape());
circleList.iterator().next(); //出错。
那么怎么解决这个问题?可以这样解决:
for(Object s : list) {
}
}
具体我们刚才讨论的Shape和Circle的问题可以这样写:
for(Shape s : list) {
s.say();
}
}
其中public void sayAll(List list) 就是public void sayAll(List list) 的意思,这个例子说明,List才是List
class Student extends Person{}
public class Census {
public static void addRegistry(Map<String, ? extends Person> registry) { ... }
};
Map<String,Driver> allDrivers = ...
Census.add(allDrivers);