所谓泛型,就是变量类型的参数化。
泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。
在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。
使用泛型时如果不指明参数类型,即泛型类没有参数化,会提示警告,此时类型为Object。
为什么使用泛型
使用泛型的典型例子,是在集合中的泛型使用。
在使用泛型前,存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型。
比如:
List myIntList = new LinkedList(); // 1 myIntList.add(new Integer(0)); // 2 Integer x = (Integer) myIntList.iterator().next(); // 3
第三行的这个强制类型转换可能会引起运行时的错误。
泛型的思想就是由程序员指定类型,这样集合就只能容纳该类型的元素。
使用泛型:
List<Integer> myIntList = new LinkedList<Integer>(); // 1' myIntList.add(new Integer(0)); // 2' Integer x = myIntList.iterator().next(); // 3'
将第三行的强制类型转换变为了第一行的List类型说明,编译器会为我们检查类型的正确性。这样,代码的可读性和健壮性也会增强。
泛型的好处
(1)类型安全。
通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全。
(2)消除强制类型转换。
消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的。
(3)提高性能。
通配符
List<?> myIntList = new LinkedList<?>(), <?>表示通配符,既可以接收任何类型的,当类型不确定时,可以使用通配符。
<? extends 类名 > 设置泛型上限。
例如 <? extends Number>,表示只能够设置Number或其子类,例如Integer、Double类
<? super 类名 > 设置泛型下限。
例如 <? extends String>,表示只能够设置String或其子类,也就是Object类。
除了集合外,还可以设置泛型接口和泛型方法,其中泛型接口在开发中比较常用
public interface IMessage <T>{ }//泛型接口
public static <T> T[] fun(T ...args){ //泛型方法
return args;
}