繁体   English   中英

Java:Class 类型不匹配

[英]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的类型不清楚,但你怎么能澄清它呢?

谢谢

Java Class 文字约束

简单地说; 不,您不能绑定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM