【问题标题】:Java: Class Type mismatchJava:类类型不匹配
【发布时间】:2020-05-14 12:02:10
【问题描述】:

我的课程结构如下:

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 的类型在第二个示例中不清楚,但您如何才能澄清它?

谢谢

【问题讨论】:

  • 可能是因为B 是泛型,其中T 未定义,在C 中,B 类型定义为X,因为您扩展了B&lt;X&gt;
  • @Eklavya 是的,我想是的。虽然B 中的T 未定义,但它必须至少为Y,因此应符合Z 的条件。

标签: java class inheritance


【解决方案1】:

Java 类文字约束

简单地说;不,您不能绑定 Class literal 分配,因为 B&lt;T&gt; 是泛型类型,即您可以:

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 类的类型,因此它不允许这样的赋值。 p>

法律转让

下面的赋值语句是合法的(编译正常):

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

但带有警告,这将完全符合 Generic Class and Type Parameters Java Language Specification

我多次看到 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);

乍一看,这应该行不通,但毕竟将 类文字 分配给 类引用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多