Java:类类型不匹配

Gerrit Sedlaczek:

我有一些结构如下的类:

interface Z {}

interface Y extends Z {}

interface X extends Y {}


private static class A<T extends Z> {}

private static class B<T extends Y> extends A<T> {}

private static class C extends B<X> {}

为什么第一个有效,而第二个无效?

private Class<? extends A<? extends Z>> clazz = C.class; // valid
private Class<? extends A<? extends Z>> clazzb = B.class; // error: Type mismatch: cannot convert from Class<TEST.B> to Class<? extends TEST.A<? extends TEST.Z>>

我想这是因为Y在第二个示例中不清楚的类型,但是您将如何澄清呢?

谢谢

tmarwen:

Java类文字约束

简单地说;不,您不能普通类型那样绑定Class文字分配B<T>,即可以:

Class<? extends A<? extends Z>> clazzb = B<X>.class; // illegal statement
// OR
Class<? extends A<? extends Z>> clazzb = B<W>.class; // assuming W is a sub-type of X

因为只有一个类文字(就字节码(运行时)和语言约束(编译时)而言): B.class

而且由于编译器将无法知道类型参数T将用于B该类,因此它将不允许此类分配。

法律转让

下面的分配声明将是合法的(可以编译):

Class<? extends A> clazzb = B.class;

但是有警告,完全符合Java语言规范通用类和类型参数

我已经多次见过Java特定模式,在该模式下,开发人员使用通用实用程序方法解决编译器类型检查,从而推断出其返回类型以匹配分配的引用类型:

<!-- language : lang-java -->

@SuppressWarnings("unchecked")
public static <T> Class<T> inferType(Class<?> clazz) {
    return (Class<T>) clazz;
}

然后,您将可以执行过去被禁止的操作

Class<? extends A<? extends Z>> clazzb = generify(B.class);

请注意,这应该只是不建议的解决方法。为了让您更加确定,在这里编写了一个相当混乱的语句,可以很好地进行编译:

Class<C> clazzb = generify(A.class);

乍一看,这不应该工作,但它会为你分配一个类文字类引用毕竟。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章