-1

考虑这个样本:

private <T> void m(Class<? extends T> k, Set<Class<? extends T>> sk) {
    Class<?> ku = k;
    Set<Class<?>> sku = sk; // <-- Type mismatch: cannot convert from
                            //     Set<Class<? extends T>> to Set<Class<?>>
}

换句话说,我可以将 a 分配给Class<? extends T>a Class<?>T但不能将 a 分配Set<Class<? extends T>>给 a Set<Class<?>>

它可能与协方差/逆变的一些限制有关,但是什么?

我可以介绍一个演员表:Class.class::cast会做。但是有没有办法通过微妙的 type-fu 让编译器按照我的意愿弯曲,而不是用演员表猛烈抨击它?

4

1 回答 1

3

即使 aClass<? extends T>是 a Class<?>, aSet<Class<? extends T>>也不是 a Set<Class<?>>,出于同样的原因,即使 aDog是 a Animal, aList<Dog>也不是 a List<Animal>。在这里,与? extends T具有相同的作用Dog,并且与?具有相同的作用Animal

你需要一个? extends在前面Class才能让它正确编译。

Set<? extends Class<?>> sku = sk;
于 2015-10-05T22:39:08.783 回答