JDK 1.5中引入了泛型的概念。
泛型在编程中的好处:
1 可以在编译时检查存储的数据是否正确。软件开发有一个趋势就是尽早的发现错误,最好就是在编译阶段,泛型正好
符合这一条件。
2 减少了强制转换,String str = (String)strList.get(0);这样的操作属于一种向下转型,是比较危险的操作,当List内
存储的对象不适合String时就会抛出异常。
泛型最常见的是被应用在接口、类、方法上。
泛型应用在接口上
public interface ValuePair<A,B>{
public A getA();
public B getB();
public String toString();
}
泛型应用在类上
public class ValuePairImpl<A,B>{
public final A first;
public final B second;
public ValuePairImpl(A a,B b){
first = a;
second = b;
}
public A getA(){
return first;
}
public B getB(){
return second;
}
public String toString(){
return "{"+first+","+second+"}";
}
}
如果这个类实现泛型接口
public class ValuePairImpl<A,B> implements ValuePair<A,B>{
.......
}
泛型应用在方法上
public class GenericMethod{
public <T> void printValue(T v){
String str = v.getClass().getName()+"="+v.toString();
System.out.println(str);
}
}
限制泛型的可用类型
<T extends parentClass>
<T extends parentClass & parentInterface1 & parentInterface2>
通配符泛型
List<String> list = new ArrayList<String>();
List<Integer> list = new LinkedList<Integer>();
public void print(List<? extends Number> lst){
for(int i =0;i<lst.size();i++){
System.out.println(lst.get(i));
} //这个例子中只能放数字格式的
}
--三种形式
Generic Type<?>
Generic Type<? extends upperBoundType>
Generic Type<? super lowerBoundType>
泛型内部采用了类型擦除机制,导致一些特殊情况下的编译失败和只能get不能set的情况
通过一些技巧可以让编译器重构类型信息使得set方法能够被使用。