【发布时间】:2015-05-07 01:09:18
【问题描述】:
为什么下面的代码不能编译?
interface Iface<T> { }
class Impl<T> implements Iface<T> { }
class TestCase {
static Class<? extends Iface<?>> clazz = Impl.class;
}
错误是
java:不兼容的类型:
java.lang.Class<Impl>无法转换为java.lang.Class<? extends Iface<?>>
但我不明白为什么通配符不捕获。
【问题讨论】:
-
另请参阅"Cannot convert from List<List> to List<List<?>>" 以获取详细说明。 (您正在尝试将
Class<Impl>转换为Class<? extends Iface<?>>,因此基本上适用相同的规则。)如果您真的需要这个,那么按照我在那里描述的方式进行转换应该没问题。(Class<? extends Iface<?>>)(Class<? extends Impl>)Impl.class否则,请避免使用原始类型参数。 -
@Radiodef 感谢您的链接!遗憾的是,演员表不适用于注释参数,这是激发这个问题的现实用例。
-
哎哟。我不知道该建议什么。您可以将注释更改为
Class<? extends Iface>,但它是嗯。取决于您使用该类的目的。你可以用这种方式对其进行注释,然后再进行 kludge 投射。
标签: java generics bounded-wildcard