Java 如何从具有泛型的类访问.class?
对于没有泛型的类,我可以访问如下.class属性:Java 如何从具有泛型的类访问.class?,java,generics,Java,Generics,对于没有泛型的类,我可以访问如下.class属性: class Foo{ Class<Foo> getMyClass(){ return Foo.class; } } class Foo<T>{ Class<Foo<T>> getMyClass(){ return (Foo<T>).class //this doesnt work... } } class-Foo{ 类
class Foo{
Class<Foo> getMyClass(){
return Foo.class;
}
}
class Foo<T>{
Class<Foo<T>> getMyClass(){
return (Foo<T>).class //this doesnt work...
}
}
class-Foo{
类getMyClass(){
返回Foo.class;
}
}
但是如果Foo有一个泛型,我如何访问这个“.class”属性呢?像这样:
class Foo{
Class<Foo> getMyClass(){
return Foo.class;
}
}
class Foo<T>{
Class<Foo<T>> getMyClass(){
return (Foo<T>).class //this doesnt work...
}
}
class-Foo{
类getMyClass(){
return(Foo).class//这不起作用。。。
}
}
我已尝试返回Foo.class
,但这行不通:“无法从一个类转换到另一个类”
我如何访问
Foo
的类?没有办法,因为。这:
您始终可以这样做:
class Foo<T>{
Class<Foo<T>> getMyClass(){
return (Class<Foo<T>>)(Class<?>)Foo.class
}
}
class-Foo{
类getMyClass(){
返回(类)(类)Foo.Class
}
}
您将有未选中的强制转换警告,因为它确实是不安全的——正如其他人所提到的,返回的类对象不再是“
Foo
's class”而是“Foo
's class”。可能是no的重复,它不是重复的。这个问题的答案是如何从泛型类型创建实例;我的问题是关于访问模板类的类。我想通过classx创建Foo
的一个实例;x、 newInstance()
和的可能重复项。类
由于类型擦除和类
类所做的工作而没有意义。java不是C++。泛型不是模板。在上面的示例中,x.newInstance()
将根据定义返回Foo
,因为泛型是在运行时不存在的编译时概念,而运行时就是发生反射的时候。仅供参考如果您真的想将泛型与反射一起使用,则需要执行类型转换。编译器可能会将它们标记为不安全,因此您可能需要@SuppressWarnings()
注释。我会反复检查以确保这些石膏确实是安全的。警告是用来帮助检测逻辑错误的,但是使用反射和泛型,确实没有安全的方法可以避免。请注意不要编写任何“未记录的特性”。但是,如果Foo.class和Foo.class
是相同的。。。为什么我不能这样做Class x=(Class)Foo.Class
这将产生以下错误:不能从一个类转换到另一个类
你不能从Foo.Class
转换到Class
,Supremo
不能替代Supremo
。这一切归结为类型擦除,类型信息在运行时丢失,呈现此类无效的强制转换。抱歉,这是无法避免的,这是Java固有的限制。谢谢。。。看来我还得多读一些关于类型的书ereasure@Bengalaa:如果A
和B
不同且不是通配符,则永远不能从Foo
强制转换为Foo
。此操作有效,但仍会收到警告。。。有没有一种方法可以在没有得到警告的情况下做到这一点呢?@Martin:没有,因为实际上没有什么东西是类。对于Foo
,只有一个Class
对象。