// 这句代码获取不到泛型class
new Test<String>().getTClass();
// 这句代码可以获取到泛型class,因为是匿名内部类,本质也算继承了
new Test<String>(){}.getTClass()
// 这句代码正常获取泛型class,因为在继承的情况下是可以的
new TestImpl().getTClass();
public class Test<T> {
public Class<T> getTClass() {
return (Class<T>) ((ParameterizedType) Test.this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}
public class TestImpl extends Test<String> {
}
总结:
这样new Test<String>()是获取不到泛型Class的,无解,我觉得是java的缺陷。
只有继承一下在获取才能获取到泛型Class,例如上面的TestImpl示例。
虽然new Test<String>(){}.getTClass()可以获取到泛型,但是我们提供基础类,不能要求使用者必须用匿名内部类,使用者容易写错,所以不建议这样用。
有没有想起来Gson就是这样做的?因为Gson家喻户晓,所以大家都记住了。
new Gson().fromJson("json",new TypeToken<List<String>>(){}.getType());
如果想解决new Test<String>()获取不到泛型的问题,可以这样设计:
public class TestNew<T> {
Class<T> clazz;
public TestNew(Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> getTClass() {
return clazz;
}
}
Class<?> clazz3 = new TestNew<String>(String.class).getTClass(); Log.e("clazz 3", clazz3.toString());