Java泛型初探————泛型通配

T    ?    K    V    E

?——表示不确定的Java类型
T——表示Java类型
K、V——分别代表键-值中的Key-Value,例如Map<K,V>,put(K key, V value)
E——代表Element,例如List<E>,add(E e)

java.lang.Class

Class类的实例,描述的是Java应用在JVM中的普通类(class 和 enum)或接口(interface 和annotion)。换句话说,每个java类运行时都在JVM中表现为一个Class对象。
Class对象获取:
第一种方式: 对象.getClass()
Student sdt = new Student();
Class<?> sdtClz = sdt.getClass();
第二种方式: 类名.class
Class<?> sdtClz2 = Student.class;

第三种方式:静态方法Class.forName("完整类名")

Class<?> sdtClz3 = Class.forName("thinging.in.java.Student");
说明:关于Class对象的用处,像forName()和newInstance()都是比较常见的,其他方法请参考Class类源码

数组同样也被映射为Class对象的一个类,根据数组元素类型和维数的不同,具有相同的数组元素类型与维数的数组会共享同一个Class对象。另外,八大基本型和关键字void同样表现为Class对象。

Class<T> 、Class<?> 、T

Class<?>是通配泛型,?代表任何类型,也可以(取巧地)理解为Object类型(也就是说Class<?>与Class<Object>是等价的)。因此,Object类型的Class对象,在newInstance的时候当然也是返回一个Object对象,如果我们需要具体的某一个类的对象,当然需要强转。
但是,Class<T>在实例化的时候,T要替换成具体类。也就是类似于Class<Student>、Class<Square>这类形式,这种方式,我们在使用Class对象的时候对Class对象进行了类型约束,因此,在使用Class对象进行实例化的时候(Class.newInstance())就不需要进行强制转化成我们需要的类型,因为<T>已经帮我们进行了类型的约束。
T 同样表示某一个具体类型,我们定义一个泛型方法如下:
public static <T> String getSomething(T bean){
        return "something";
}
当我们调用这个getSomething方法的时候,允许程序员传入任何类型的对象,但是参数的类型T只是在传值时可以任意选择,但是一旦传入了某个具体类型的bean,那么运行时的T便已经确定。另外,参数类型需要写在返回值前面并用<>括起来。

受限通配、下限通配

<? extends T> 代表受限通配,表示T类型的子类;
<? super T> 代表下限通配,表示T类型的一个未知父类。

猜你喜欢

转载自blog.csdn.net/u014745069/article/details/80031874