泛型适用的是类类型,而不能是简单类型
泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
List<Integer>
与List<Boolean>
的Class是一样的,所以说类型相同
泛型标识<泛型标识>
可以声明在类和方法
?
代表的某一种类型,而不是多种,是实际的参数,而不是像T
的形式参数
public class GenericsClass<T> {
private T key;
public GenericsClass(T key)
{
this.key = key;
}
public T getKey() {
return key;
}
}
表明T是泛型类型
GenericsClass<Integer> a = new GenericsClass<Integer>(123); //显示声明
GenericsClass a = new GenericsClass(123);
GenericsClass<?>可以匹配任何类型,但是只能使用Object的方法
public interface GenericsInterface<T> {
public T hello();
}
可以还是返回泛型
public class GenericsImpl<Anything> implements GenericsInterface {
@Override
public Anything hello() {
return null;
}
}
或者返回具体类
public class GenericsImpl implements GenericsInterface<Object> {
@Override
public Object hello() {
return null;
}
}
public class GenericsMethod<T> {
private T key;
public T hello()
{
return key;
}
public <T> T hello(GenericsClass<T> genericsClass)
{
T a = genericsClass.getKey();
return a;
}
}
只要方法有<泛型标识>
,那么即使方法中声明的泛型T与类声明的泛型T是一个字母,但是他们是两个不同的泛型,所以说泛型方法能使方法独立于类而产生变化
类中定义使用泛型的静态方法,需要添加额外的泛型声明
public static <T> void show(T t){}
无论何时,如果你能做到,你就该尽量使用泛型方法。也就是说,如果使用泛型方法将整个类泛型化,
那么就应该使用泛型方法。另外对于一个static的方法而已,无法访问泛型类型的参数。
所以如果static方法要使用泛型能力,就必须使其成为泛型方法。
GenericsClass<T extends Number>
表示GenericsClass可以声明为GenericsClass<Number及其子类>
GenericsClass<T super Number>
表示GenericsClass可以声明为GenericsClass<Number及其父类>
List
普通的集合定义,可以存放任何数据
List<Object>
泛型限制Object,但是List