快乐学习
前程无忧、中华英才非你莫属!

Java泛型和类型安全

ArrayList or ArrayList<Apple>

不使用泛型:

Java中的ArrayList 容器,在没有应用泛型的时候也可以使用,编译时不做检查。

容器里面存储的是对象的引用,在使用get() 方法取出的对象是Object引用,所以要手动强制类型转换才可以应用具体类的方法。

[java] view plain copy

  1. package source.gohome02;  

  2.   

  3. import java.util.ArrayList;  

  4.   

  5. class Apple {  

  6.     private static long counter ;  

  7.     private final long id = counter++;  

  8.     public long id() { return id; }   

  9. }  

  10. class Orange {}  

  11. public class ApplesAndOrangesWithoutGenerics {  

  12.     public static void main(String[] args) {  

  13.         ArrayList apples = new ArrayList();  

  14.         for(int i = 0; i < 3; i++)  

  15.             apples.add(new Apple());  

  16.         apples.add(new Orange());   //run-time error  

  17.         for(int i = 0; i < apples.size(); i++)  

  18.             System.out.println(((Apple)apples.get(i)).id());  

  19.     }  

  20. }  

output:

使用泛型:

能够在编译时检查类型错误,利用get()方法取出的对象也不再是Object引用,编译器可以认识此类型。


[java] view plain copy

  1. package source.gohome02;  

  2.   

  3. import java.util.ArrayList;  

  4.   

  5. public class ApplesAndOrangesWithGenerics {  

  6.     public static void main(String[] args) {  

  7.         ArrayList<Apple> apples = new ArrayList<Apple>();  

  8.         for(int i = 0; i < 3; i++)  

  9.             apples.add(new Apple());  

  10.     //  apples.add(new Orange());   compile-time error  

  11.         for(int i = 0; i < apples.size(); i++)  

  12.             System.out.println(((Apple)apples.get(i)).id());  

  13.         for(Apple a: apples)  

  14.             System.out.println(a.id());  

  15.     }  

  16. }  

output:


并且,支持向上转型。也就是说,该类的导出类对象均可以存储在此容器中,支持所有操作。

[java] view plain copy

  1. package source.gohome02;  

  2.   

  3. import java.util.ArrayList;  

  4.   

  5. class GrannySmith extends Apple {}  

  6. class Gala extends Apple {  

  7.     public String toString() {  return "Gala"; }  

  8. }  

  9. class Fuji extends Apple {  

  10.     public String toString() {  return "Fuji"; }  

  11. }  

  12.   

  13. public class GenericsAndUpcasting {  

  14.     public static void main(String[] args) {  

  15.         ArrayList<Apple> apples = new ArrayList<Apple>();  

  16.         apples.add(new Apple());  

  17.         apples.add(new GrannySmith());  

  18.         apples.add(new Gala());  

  19.         apples.add(new Fuji());  

  20.         for(Apple a : apples)  

  21.             System.out.println(a);  

  22.         //程序的输出是从Object默认的toString()方法产生的,如果没有重载  

  23.         //类名 + 该对象的散列码  

  24.     }  

  25. }  

output:


转载至:http://blog.csdn.net/wangyunyun00/article/details/38404861


打赏

未经允许不得转载:同乐学堂 » Java泛型和类型安全

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

特别的技术,给特别的你!

联系QQ:1071235258QQ群:226134712
error: Sorry,暂时内容不可复制!