/**
     * 在阅读别人写的源代码中,有时候可以看到同样功能的泛型方法中的参数可以写成 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();
     */