一句话,泛型的本质是 参数化类型
基本用法
一个简单的例子如下:
public class Test{
public static void main(String[] args){
Type integer = new Type<Integer>(3);
Type str = new Type<String>("hello");
Integer i = (Integer)integer.print();
String s = (String)str.print();
System.out.println(integer.getClass() == str.getClass()); //true
}
}
class Type<T> {
T data;
public Type(T data){
this.data = data;
}
public T print(){
System.out.println(data);
return data;
}
}
在类Type中,属性data不事先指定类型,而是使用泛型<T>
代替,这样就可以为同一个类声明多种类型的属性。
integer.getClass() == str.getClass()
的结果为true,可知编译后,并不会因为多种类型就分别生成多个Type类。
泛型方法
除了用于类,还可以用于方法。泛型方法的类型参数放在返回类型前面。
public static void main(String[] args){
Integer[] in = {1,2};
String[] str = {"love","live"};
print(in);
print(str);
}
public static <T> void print(T[] data){
System.out.println(data[0]+" "+data[1]);
}
通配符
<?>
代替具体的类型参数
public class Test{
public static void main(String[] args){
Type integer = new Type<Integer>(3);
Type str = new Type<String>("hello");
print(integer);
print(str);
}
public static void print(Type<?> type){
System.out.println(type.data);
}
}
class Type<T> {
T data;
public Type(T data){
this.data = data;
}
}
实际上,上述代码中的Type<?>
可以简化为Type
。
通配符的上下界
通配符的主要意义在于设定其上限和下限。
public class Test{
public static void main(String[] args){
Type<Integer> integer = new Type<Integer>(3);
Type<String> str = new Type<String>("hello");
print(integer);
//print(str); 这里会报错
}
public static void print(Type<? extends Number> type){
System.out.println(type.data);
}
}
class Type<T> {
T data;
public Type(T data){
this.data = data;
}
}
Type<? super Number>
与Type<? extends Number>
相反,表示只能是Number的父类.