Object obj = new Test();
//下面这行可以成功编译
((Test)obj).getClass().newInstance().func();
//下面这两行无法通过编译
/*Class c = ((Test)obj).getClass();
c.newInstance().func(); */
原因有点巧妙:
JAVA定义Object.getClass为 public final Class<? extends Object> getClass()
Class.newInstance()定义为:
public T newInstance() throws InstantiationException,IllegalAccessException
所以((Test)obj).getClass()返回的结果是Class<? extends Test> ,所以,第一种情况认为T是Test类型,可以通过编译。
而第二种情况,其实我们将Class<? extends Test>进行类型转换了,使得变量c的实际类型是Class<?>,所以T没有办法确定是哪种类型,造成编译不通过!