/**
* 在阅读别人写的源代码中,有时候可以看到同样功能的泛型方法中的参数可以写成 T t 或者 Class<T> cls
* 那么,两者有什么区别呢?
*
* Class类,是代表加载到jvm中的类的字节码,这个类本身是泛型类,其后可以加<具体类>从而表示具体类的字节码类型,
* 于是Class<T>,就代表了类T的字节码类型。于是Class<T> cls中的cls就是类型T的字节码对象实例。
*
* 另一方面:
* T t 就很好理解了,T是方法返回值前面的泛型列表中指定的泛型类型,小t表示这个类型的对象。
*
* 请参考如下的三个方法仔细体会。
*
*/
/**
* 接受任意类型的对象,并返回该对象。
* @param t
* @param <T>
* @return
*/
public <T> T doSomething0(T t) {
return t;
}
/**
* 接受任意字节码实例,并通过该字节码创建实例并返回。
* 但是由于方法指定返回类型是T,所以返回时候要做强制类型转换,
* 因此传入的cls应该是返回值t对应类的字节码对象。
* 由于是强转没有做类型检查,所有使用了@SupperessWarning("unchecked")压制编译器产生的警告。
* @param cls
* @param <T>
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public <T> T doSomething1(Class cls) throws Exception {
return (T) cls.newInstance();
}
/**
* 接受T类型的字节码对象,并根据此字节码对象创建对应类的实例并返回
* @param cls
* @param <T>
* @return
* @throws Exception
*/
public <T> T doSomething2(Class<T> cls) throws Exception {
return cls.newInstance();
}
/**
* 最后,
* Class对象实例可以用任意类型对象的.getClass()方法取得,
* Class对象的实例也可用任意类型.class 直接表示。
*
* Class<String> stringClass = String.class;
* Class<? extends String> aClass = "abc".getClass();
*/