[英]Java: Class Type mismatch
我的课程结构如下:
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
的类型不清楚,但你怎么能澄清它呢?
谢谢
简单地说; 不,您不能绑定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
因为只有一个 class 文字(就字节码(运行时)和语言约束(编译时)而言): B.class
由于编译器无法知道B
class 的类型参数T
是哪种类型,因此它不允许这样的赋值。
下面的赋值语句是合法的(编译得很好):
Class<? extends A> clazzb = B.class;
但带有警告,这将完全符合通用 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);
乍一看,这应该行不通,但毕竟将class 文字分配给class 引用时,它会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.