首页 > 代码库 > 泛型(Generic)

泛型(Generic)

当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常

技术分享
 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     @Override32     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     @Override54     public String toString() {55         return "Sheep@name:" + this.name;56     }57 58     public void eat() {59         System.out.println(this.name + "吃青草");60     }
View Code

原因 :发现虽然集合可以存储任意对象,但是如果需要使用对象的特有方法,那么就需要类型转换,如果集合中存入的对象不同,可能引发类型转换异常.

出现问题:

存入的是特定的对象,取出的时候是Object对象,需要强制类型转换,可能诱发类型转换异常.

无法控制存入的是什么类型的对象,取出对象的时候进行强转时可能诱发异常.而且在编译时期无法发现问题.

虽然可以再类型转换的时候通过if语句进行类型检查(instanceof),但是效率较低.(例如吃饭的时候,还需要判断米饭里有没有沙子,吃饭效率低).可以通过给容器加限定的形式规定容器只能存储一种类型的对象.

就像给容器贴标签说明该容器中只能存储什么样类型的对象。

所以在jdk5.0后出现了泛型

泛型应用:

格式

  1. 集合类<类类型>  变量名  = new  集合类<类类型>();
技术分享
 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 }
View Code

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 }
View Code

细节二:

泛型类型必须是引用类型

技术分享
 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 }
View Code

细节三: 使用泛型后取出元素不需要类型转换.

技术分享
 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 }
View Code

 (见就业班回顾)

泛型(Generic)