标签:
当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 4 public class Demo5 { 5 public static void main(String[] args) { 6 ArrayList arr = new ArrayList(); 7 arr.add(new Tiger("华南虎")); 8 arr.add(new Tiger("东北虎")); 9 arr.add(new Sheep("喜羊羊")); 10 System.out.println(arr); 11 Iterator it = arr.iterator(); 12 while (it.hasNext()) { 13 Object next = it.next(); 14 Tiger t = (Tiger) next; 15 t.eat(); 16 } 17 18 } 19 } 20 class Tiger { 21 String name; 22 23 public Tiger() { 24 25 } 26 27 public Tiger(String name) { 28 this.name = name; 29 } 30 31 @Override 32 public String toString() { 33 34 return "Tiger@name:" + this.name; 35 } 36 37 public void eat() { 38 System.out.println(this.name + "吃羊"); 39 } 40 } 41 42 class Sheep { 43 String name; 44 45 public Sheep() { 46 47 } 48 49 public Sheep(String name) { 50 this.name = name; 51 } 52 53 @Override 54 public String toString() { 55 return "Sheep@name:" + this.name; 56 } 57 58 public void eat() { 59 System.out.println(this.name + "吃青草"); 60 }
原因 :发现虽然集合可以存储任意对象,但是如果需要使用对象的特有方法,那么就需要类型转换,如果集合中存入的对象不同,可能引发类型转换异常.
出现问题:
存入的是特定的对象,取出的时候是Object对象,需要强制类型转换,可能诱发类型转换异常.
无法控制存入的是什么类型的对象,取出对象的时候进行强转时可能诱发异常.而且在编译时期无法发现问题.
虽然可以再类型转换的时候通过if语句进行类型检查(instanceof),但是效率较低.(例如吃饭的时候,还需要判断米饭里有没有沙子,吃饭效率低).可以通过给容器加限定的形式规定容器只能存储一种类型的对象.
就像给容器贴标签说明该容器中只能存储什么样类型的对象。
所以在jdk5.0后出现了泛型
泛型应用:
格式
1 public class Demo5 { 2 public static void main(String[] args) { 3 // 使用泛型后,规定该集合只能放羊,老虎就进不来了. 4 ArrayList<Sheep> arr = new ArrayList<Sheep>(); 5 arr.add(new Sheep("美羊羊")); 6 arr.add(new Sheep("懒洋洋")); 7 arr.add(new Sheep("喜羊羊")); 8 // 编译失败 9 // arr.add(new Tiger("东北虎")); 10 System.out.println(arr); 11 Iterator<Sheep> it = arr.iterator(); 12 while (it.hasNext()) { 13 // 使用泛型后,不需要强制类型转换了 14 Sheep next = it.next(); 15 next.eat(); 16 } 17 18 } 19 }
1. 将运行时的异常提前至编译时发生。
2. 获取元素的时候无需强转类型,就避免了类型转换的异常问题
格式 通过<> 来指定容器中元素的类型.
什么时候使用泛型:当类中操作的引用数据类型不确定的时候,就可以使用泛型类.
细节一
声明好泛型类型之后,集合中只能存放特定类型元素
1 public class Demo6 { 2 public static void main(String[] args) { 3 //创建一个存储字符串的list 4 ArrayList<String> arr=new ArrayList<String>(); 5 arr.add("gz"); 6 arr.add("itcast"); 7 //存储非字符串编译报错. 8 arr.add(1); 9 } 10 }
细节二:
泛型类型必须是引用类型
1 public class Demo6 { 2 public static void main(String[] args) { 3 // 泛型类型必须是引用类型,也就是说集合不能存储基本数据类型 4 // ArrayList<int> arr2=new ArrayList<int>(); 5 6 // 使用基本数据类型的包装类 7 ArrayList<Integer> arr2 = new ArrayList<Integer>(); 8 9 10 } 11 }
细节三: 使用泛型后取出元素不需要类型转换.
1 public class Demo6 { 2 public static void main(String[] args) { 3 4 ArrayList<String> arr = new ArrayList<String>(); 5 arr.add("gzitcast"); 6 arr.add("cditcast"); 7 arr.add("bjitcast"); 8 //使用泛型后取出元素不需要类型转换. 9 String str=arr.get(0); 10 System.out.println(); 11 } 12 }
(见就业班回顾)
标签:
原文地址:http://www.cnblogs.com/Michael2397/p/5968343.html