[英]Java generics <? extends Class> and Class<P> issue
[英]Java generics issue with Class
无法弄清楚这个泛型问题。 我有这些接口:
public interface LoadableObject
{
}
public interface LoadableObjectFactory<T>
{
}
现在我想这样做:
public class ObjectReference<T extends LoadableObject>
{
Class<? extends LoadableObjectFactory<T>> _cls;
public ObjectReference(LoadableObjectFactory<T> obj)
{
_cls = obj.getClass();
}
}
但是我收到一个错误:
incompatible types
found : java.lang.Class<capture#885 of ? extends test.LoadableObjectFactory>
required: java.lang.Class<? extends test.LoadableObjectFactory<T>>
_cls = obj.getClass();
^
如果我在_cls
的定义中删除了LoadableObjectFactory
的类型参数,我能够编译,但是它是一个不完整的类型......是否有我遗漏的东西或者它根本不可能?
运行时的getClass()提供了Class <?>。 由于类型擦除,关于通用参数的信息不可用。 你必须做一个演员
@SuppressWarnings("unchecked")
public ObjectReference(LoadableObjectFactory<T> obj)
{
_cls = (Class<? extends LoadableObjectFactory<T>>) obj.getClass();
}
让它工作
我不会指责'类型擦除'。 静态查看代码,它显然是安全的,它应该在更好的世界中传递编译器。
Java Generics太复杂了,不值得花时间弄清楚每一个细节。 如果你知道你比编译器更清楚,那就做一些事情来绕过它。
我原以为LoadableObjectFactory看起来像这样:
public interface LoadableObjectFactory<T extends LoadableObject>
话虽如此 - Object.getClass()返回一个无类型的类,所以你必须强制转换它。 要修复它,必须将java.lang.Object的签名更改为
class Object<T extends Object<T>> {
native Class<T> getClass();
}
但是对java.lang.Object的改动将涉及几乎无处不在的大手术。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.