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