java中类型参数的类名?

viv*_*k.m 13 java

假设T是一个类类型参数,为什么我不能使用T.class

我正在编写一个下载页面并根据传递的类解析它的函数.对于解析,我使用另一个签名为的函数:ParseObject::parse(Class<T> classname)

<T> void downloadParse(){
  ParseObject obj;
  obj.parse(T.class); //<--- why compiler error here?? (whereas something like Integer.class is allowed)
}
Run Code Online (Sandbox Code Playgroud)

Rev*_*nzo 17

Java泛型通过类型擦除实现.它们只能用于编译时检查.在编译之后,对象变为最低的公共对象.(在本例中为Object.class).

编译后的字节码不知道T是什么.

如果要访问该类,则需要将方法更改为:

<T> void downloadParse(Class<T> cls){
  ParserObject obj;
  obj.parse(cls);
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然使用它没有多大意义.只需使用`Class <?>`即可获得相同的效果.只有你需要强制执行某种类型才有意义,例如`<T extends Comparable <?>> void dp(Class <T> cls)`.对于泛型的重要规则:尽量避免使用它们;) (4认同)