gpt4 book ai didi

java - 有界通配符未编译

转载 作者:搜寻专家 更新时间:2023-11-01 03:02:01 25 4
gpt4 key购买 nike

我有这样的代码:

interface InterfaceA { ... }

interface InterfaceB { ... }

class ClassA {
public void methodA(Class<? extends InterfaceB> clazz) { ... }
}

class ClassB<P extends InterfaceA & InterfaceB> {
public void methodB(P p) {
new ClassA().methodA(p.getClass());
}
}

问题是:为什么编译器不允许将 p.getClass() 作为参数传递给方法 methodA - 错误消息是:

The method methodB(Class<? extends InterfaceB>) in the type ClassA is not applicable for the arguments (Class<capture#1-of ? extends InterfaceA>)

很明显 P 类型在 ClassB 中扩展了 InterfaceB,所以我不知道为什么它不起作用。

最佳答案

Object#getClass() 的返回类型是

The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.

删除p的静态类型(调用 getClass 的表达式)是删除

P extends InterfaceA & InterfaceB

这是InterfaceA .这在有关 Type Erasure 的 Java 语言规范章节中指定。

The erasure of a type variable (§4.4) is the erasure of its leftmost bound.

您的方法接受 Class<? extends InterfaceB> , 不是 Class<? extends InterfaceA> .这就是您的示例无法编译的原因。

您可以重新排序边界以使这个示例工作

class ClassB<P extends InterfaceB & InterfaceA> {

关于java - 有界通配符未编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com