Java基础之Java泛型
一、泛型的意义与目的
背景:因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患,如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题。JDK1.5后出现了泛型,用于解决集合框架的安全问题。泛型是一个类型安全机制。
目的:
-
类型安全
-
泛型的主要目标是提高 Java 程序的类型安全
-
编译时期就可以检查出因 Java 类型不正确导致的 ClassCastException 异常
-
符合越早出错代价越小原则
-
-
消除强制类型转换
- 泛型的一个附带好处是,使用时直接得到目标类型,消除许多强制类型转换
- 所得即所需,这使得代码更加可读,并且减少了出错机会
-
潜在的性能收益
- 由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改
- 所有工作都在编译器中完成
- 编译器生成的代码跟不使用泛型(和强制类型转换)时所写的代码几乎一致,只是更能确保类型安全而已
// 经典案例
// 会抛出类型转换异常 java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("123");
list.add(123);
for (int i = 0;i< list.size();i++){
String value = (String) list.get(i);
System.out.println(value);
}
}
二、泛型的概念
“泛型” 意味着编写的代码可以被不同类型的对象所重用。泛型的提出是为了编写重用性更好的代码。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
类型参数列表
三、泛型的常规用法
-
泛型类(在类名后加上类型参数列)
public class DomeGeneric<T> { private T value; private T[] ValueArray; public static void main(String[] args) { DomeGeneric<String> stringDemo = new DomeGeneric<>(); stringDemo.setValue("111"); stringDemo.setValueArray(new String[]{"1","2"}); System.out.println(stringDemo.toString()); // 输出DomeGeneric{value=111, ValueArray=[1, 2]} } // 省略get set toString方法 }
-
泛型接口(在接口名后加上类型参数列)
public interface DomeGenericInterface<T> { void doSomeThing(T t); }
注意的是在实现泛型接口事一定要实现类型参数的具体类型,不然没有什么意义
-
泛型方法(介于方法修饰符和返回值之间的称作类型参数列表<M,N>(可以有多个))
public class DomeGenericMethod { public <E> List<E> doSomething(List<E> listOne,List<E> listTwo){ List listResult = new ArrayList(listOne); listResult.addAll(listTwo); System.out.println(listResult); return listResult; } }
小贴士
声明一般类型的参数类型使用的是,一般的集合类型默认,键值对使用的是<K,V>