前言
java的基础知识点都是在开发功能中应用和体现的。我在学习简历中提到的异常框架,里面就涉及到泛型的应用。
阅读目录
- 一、泛型概念的提出(为什么会出现泛型)
- 二、什么是泛型
- 三、泛型类、泛型方法、泛型接口
- 四、类型通配符
一.泛型概念的提出(为什么会出现泛型?)
举例,
List list = new ArrayList(); list.add("hello"); list.add("sassy"); list.add(100); for(int i=0;i<list.size;i++){ String name = (String)list.get(i); System.out.println("name : "+name); }
这会出现什么问题呢?
这会出现编译时正常,但运行时出现错误,java.lang.ClassCastException
为什么呢?
因为list的默认类型是Object类型,加入两个字符串的值和Integer类型的值是完全允许的。这也就是说在编译阶段是正常的。但是在运行时忘记了加入Integer类型的值,在类型转换时就出现了java.lang.ClassCastException的错误。
由此,我们发现主要存在两个问题:
(1)当我们把对象放入到集合时,集合是不会记住本身类型的,当再次从集合中循环取出此对象时,该对象的编译类型变成了Object类型。但是在运行时仍是其本身类型。
(2)在取出集合元素,需要人为的强制转换为具体的目标类型,容易出现java.lang.ClassCastException.
有什么办法能解决上述2个问题呢?答案是泛型,java泛型的引入增加了编译阶段的类型检查就不会出现运行阶段类型转换异常。
二、什么是泛型
类型形参:List接口采用泛型化定义后,List<E>中的E表示类型形参,可以接收具体的类型实参。常见的T,E,K,V等形式的参数常用于表示泛型形参。
类型实参:List<String>中的String是类型实参
三、泛型类、泛型方法、泛型接口
定义泛型类:
public Class Box<T>{ private T data; public Box(T data ){ this.data = data; } public T getdata(){ return data; } } Box<String> name = new Box<String>("sassy");
定义泛型方法:
public <T> T getObject(Class<T> c){ T t = c.newInstance(); return t; }
其中在返回值前面的<T>表示声明一个泛型方法,持有一个泛型T定义
定义泛型接口:
public Interface Map<K,V>{ public void put(K key,V value); public V get(K key); }
四、类型通配符
?
类型通配符一般使用?来代替具体的类型实参,注意是类型实参。
public static <T> T handle(Throwable ex, Class<T> c , Class<?extends ExTypePatternConfig> etpcClazz){ }