对比两个程序
例1,
//ArrayList类,运行是错误
import java.util.*;
class Apple{
private static long counter;
private final long id=counter++;
public long id() {return id;}
}
class Orange{}
public class ApplesAndOrangesWithoutGenerics {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList apples=new ArrayList();
for(int i=0;i<3;i++){
apples.add(new Apple());
}
apples.add(new Orange());
for(int i=0;i<apples.size();i++){
((Apple)apples.get(i)).id();//需要类型转换
}
}
}
结果
编译没问题,在运行时出错
原因,ArrayList类中即包含Apple对象,又包含Orange对象,再取出对象时,不能把Orange对象转换成Apple
可以使用泛型解决这个问题
例2
import java.util.*;
class GrannySmith extends Apple{}
class Gala extends Apple{}
class Fuji extends Apple{}
class Braeburn extends Apple{}
public class GenericsAndUpcasting {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Apple> apples=new ArrayList<Apple>();
apples.add(new GrannySmith());
apples.add(new Gala());
apples.add(new Fuji());
apples.add(new Braeburn());
for(Apple c:apples)
System.out.println(c);
}
}
结果
GrannySmith@1888759
Gala@6e1408
Fuji@e53108
Braeburn@f62373
可以定义专门保存Apple对象的容器类ArrayList
通过泛型,就可以在编译期防止将错误类型的对象放置到容器中
关于输出
程序的输出是从Object默认的toString()方法产生的,该方法将打印类名,后面跟随该对象的散列码的无符号十六进制表示(散列码通过hashCode()方法产生)