<h3>泛型的概念</h3>
泛型,本质是参数化类型,这个概念在程序设计里面很经常可以看到,泛型的使用很灵活而且高效,它允许程序员将一个实际的数据类型的规约延迟至泛型的实例被创建时才确定。泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,并允许开发者编写非常优雅的解决方案。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
<h3>泛型的好处</h3>
类型安全。
泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。消除强制类型转换。
泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。潜在的性能收益。
泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
<h3>泛型的类型</h3>
1.泛型方法(类型参数)
例如我要建一个方法,负责判断的数据大小并输出数据
<pre>
public static <T extends Comparable<T>> ArrayList<T> maximum(ArrayList<T> list){
if (list==null||list.size()==1){
return list;
}else {
for (int i=0;i< list.size();i++){
for (int j=0;j< list.size();j++){
T max;
if (list.get(i).compareTo(list.get(j))<0){
max = list.get(i);
list.set(i,list.get(j));
list.set(j,max);
}
}
}
}
for(T t:list){
System.out.println(t.toString());
}
return list;
}
CompareMethod.maximum(Arrays.asList(85,65,87,54,62,78,63));
</pre>
2.泛型类/泛型接口
<pre>
public class CompareMethodT<T extends Comparable<T>> {
public void onShow(T t) {
System.out.println("泛型类型是--->" + t.getClass());
}
}
</pre>
至于泛型接口,List本身就是个泛型接口,直接看源码就知道了。
<pre>
/**
- A {@code List} is a collection which maintains an ordering for its elements. Every
- element in the {@code List} has an index. Each element can thus be accessed by its
- index, with the first index being zero. Normally, {@code List}s allow duplicate
- elements, as compared to Sets, where elements have to be unique.
*/
public interface List<E> extends Collection<E> {
......
}
</pre>
<h3>泛型使用规则:</h3>
- 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
- 同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
- 泛型的类型参数可以有多个。
- 泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
- 泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String);