java中类型参数的类名?

java中类型参数的类名?,java,Java,假设T是类类型参数,为什么我不能使用T.class 我正在编写一个函数,下载一个页面并根据传递的类对其进行解析。 对于解析,我使用另一个函数,它的签名是:ParseObject::parse(Class classname) void downloadParse(){ parseobjectobj; obj.parse(T.class);//Java泛型是通过实现的。它们只能用于编译时检查。编译后,对象将更改为最低的公共对象。(在本例中为object.class) 编译后的字节码不知道T是什么

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

我正在编写一个函数,下载一个页面并根据传递的类对其进行解析。 对于解析,我使用另一个函数,它的签名是:
ParseObject::parse(Class classname)

void downloadParse(){
parseobjectobj;

obj.parse(T.class);//Java泛型是通过实现的。它们只能用于编译时检查。编译后,对象将更改为最低的公共对象。(在本例中为object.class)

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

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

<T> void downloadParse(Class<T> cls){
  ParserObject obj;
  obj.parse(cls);
}
void downloadParse(类cls){
ParserObject对象;
对象解析(cls);
}
是这里的恶棍。来自Java教程:

例如,Box被转换为类型Box,称为 原始类型-原始类型是没有 任何类型的参数。这意味着您无法找出 泛型类在运行时使用的对象 不可能:

public class MyClass<E> {
    public static void myMethod(Object item) {
        if (item instanceof E) {  //Compiler error
            ...
        }
        E item2 = new E();       //Compiler error
        E[] iArray = new E[10];  //Compiler error
        E obj = (E)new Object(); //Unchecked cast warning
    }
}
公共类MyClass{
公共静态void myMethod(对象项){
if(item instanceof E){//编译器错误
...
}
E item2=new E();//编译器错误
E[]iArray=new E[10];//编译器错误
E obj=(E)新对象();//未选中强制转换警告
}
}
粗体显示的操作在运行时没有意义,因为 编译器将删除有关实际类型参数的所有信息 (由类型参数E表示)在编译时

通过擦除,类型信息被删除,所有内容都只是一个对象:

当实例化泛型类型时,编译器将转换这些类型 通过一种称为类型擦除(type erasure)的技术进行类型擦除—一种 编译器将删除与类型参数和类型相关的所有信息 类或方法中的参数。类型擦除启用Java 使用泛型来维护与的二进制兼容性的应用程序 在泛型之前创建的Java库和应用程序

然后,编译器将类“T”重新引入为所需的所有类型转换。T在泛型中不“存在”,因此不能创建类T的对象。在调用泛型时,编译器将对象转换为“T”类


Google“java erasure”获取更多关于如何工作的信息。Wikipedia提供。

正如其他人所说,这是不可能的。但既然它是一个没有参数且返回void的方法,那么您希望它是什么呢

您偶尔可能会遇到以下情况:

<T> T foo(Class<T> cls) {
    Object o = ...;
    return cls.cast(o);
}

// usage - perfectly type safe
String s = foo(String.class);
T foo(类别cls){
对象o=。。。;
返回cls.cast(o);
}
//使用-完全类型安全
字符串s=foo(String.class);
此外,有时还可以获取泛型类型参数,例如:

class Foo implements Iterable<String> {
    // snip
}

ParameterizedType pt = (ParameterizedType) Foo.class.getGenericInterfaces()[0];
System.out.println(pt); // prints java.lang.Iterable<java.lang.String>

Class<?> at = (Class<?>) pt.getActualTypeArguments()[0];
System.out.println(at.getName()); // prints java.lang.String
类Foo实现了Iterable{
//剪断
}
ParameteredType pt=(ParameteredType)Foo.class.GetGenericInterface()[0];
System.out.println(pt);//prints java.lang.Iterable
类at=(类)pt.getActualTypeArguments()[0];
System.out.println(at.getName());//打印java.lang.String

但那是另一个故事;)

简短的回答:“键入擦除”。谷歌可以做其余的:)太快了!!谢谢!!你打败了谷歌人:)不理解答案100%,谷歌会更多。顺便说一句,我做了与建议相同的事情。我只需要在一些函数周围传递“cls”参数,并将其存储在实际程序中的类变量中。(这样做感觉很奇怪)这有点奇怪,但这是唯一的方法。如果Java得到具体化的泛型,它会让生活变得更加简单。但是使用它没有什么意义。只需使用
Class
就可以达到同样的效果。只有在需要强制某种类型时才有意义,例如

class Foo implements Iterable<String> {
    // snip
}

ParameterizedType pt = (ParameterizedType) Foo.class.getGenericInterfaces()[0];
System.out.println(pt); // prints java.lang.Iterable<java.lang.String>

Class<?> at = (Class<?>) pt.getActualTypeArguments()[0];
System.out.println(at.getName()); // prints java.lang.String