【java】泛型和类型安全的容器ArrayList
2014-08-06 18:08
302 查看
ArrayList or ArrayList<Apple>
不使用泛型:
Java中的ArrayList 容器,在没有应用泛型的时候也可以使用,编译时不做检查。
容器里面存储的是对象的引用,在使用get() 方法取出的对象是Object引用,所以要手动强制类型转换才可以应用具体类的方法。
使用泛型:
能够在编译时检查类型错误,利用get()方法取出的对象也不再是Object引用,编译器可以认识此类型。
并且,支持向上转型。也就是说,该类的导出类对象均可以存储在此容器中,支持所有操作。
不使用泛型:
Java中的ArrayList 容器,在没有应用泛型的时候也可以使用,编译时不做检查。
容器里面存储的是对象的引用,在使用get() 方法取出的对象是Object引用,所以要手动强制类型转换才可以应用具体类的方法。
package source.gohome02; import java.util.ArrayList; class Apple { private static long counter ; private final long id = counter++; public long id() { return id; } } class Orange {} public class ApplesAndOrangesWithoutGenerics { public static void main(String[] args) { ArrayList apples = new ArrayList(); for(int i = 0; i < 3; i++) apples.add(new Apple()); apples.add(new Orange()); //run-time error for(int i = 0; i < apples.size(); i++) System.out.println(((Apple)apples.get(i)).id()); } }output:
使用泛型:
能够在编译时检查类型错误,利用get()方法取出的对象也不再是Object引用,编译器可以认识此类型。
package source.gohome02; import java.util.ArrayList; public class ApplesAndOrangesWithGenerics { public static void main(String[] args) { ArrayList<Apple> apples = new ArrayList<Apple>(); for(int i = 0; i < 3; i++) apples.add(new Apple()); // apples.add(new Orange()); compile-time error for(int i = 0; i < apples.size(); i++) System.out.println(((Apple)apples.get(i)).id()); for(Apple a: apples) System.out.println(a.id()); } }output:
并且,支持向上转型。也就是说,该类的导出类对象均可以存储在此容器中,支持所有操作。
package source.gohome02; import java.util.ArrayList; class GrannySmith extends Apple {} class Gala extends Apple { public String toString() { return "Gala"; } } class Fuji extends Apple { public String toString() { return "Fuji"; } } public class GenericsAndUpcasting { public static void main(String[] args) { ArrayList<Apple> apples = new ArrayList<Apple>(); apples.add(new Apple()); apples.add(new GrannySmith()); apples.add(new Gala()); apples.add(new Fuji()); for(Apple a : apples) System.out.println(a); //程序的输出是从Object默认的toString()方法产生的,如果没有重载 //类名 + 该对象的散列码 } }output:
相关文章推荐
- JAVA中泛型和类型安全的容器
- Java 容器 & 泛型:二、ArrayList 、LinkedList和Vector比较
- java中使用反射往一个泛型是Integer类型的ArrayList中添加字符串,反射的案例1.
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Java 容器 & 泛型(2):ArrayList 、LinkedList和Vector比较
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- 从头认识java-9.1 类型安全的容器
- 从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
- 第11章持有对象 _11.1泛型和类型安全的容器
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Java反射技术绕过ArrayList泛型编译期间检查, 将不同类型数据存到一起
- 从头认识java-13.11 对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
- EffectiveJava(29)优先考虑类型安全的异构容器
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)
- Effective Java(优先考虑类型安全的异构容器、用enum代替int常量)