gpt4 book ai didi

java - 再次泛型通配符。

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:33 25 4
gpt4 key购买 nike

我尝试在接口(interface)中引入一些泛型时遇到以下异常(真实代码简化为一般示例):

Type mismatch: cannot convert from capture#1-of ? extends Interface2<:? extends Interface1> to Interface2<:Interface1>

失败的调用是:

Interface2<Interface1> interface2Instance = interface1Instance.getInterface2ImplementorClass().newInstance();

这些是接口(interface)定义:

public interface Interface1{
Class<? extends Interface2<? extends Interface1>> getInterface2ImplementorClass();
}

public interface Interface2<T extends Interface1> {
public Object execute(T first, OtherClass1 second, OtherClass2 third,
OtherClass3 baseTimeFormat) throws ChartScriptException;
}

我可以将失败的行更改为:

Interface2<**? extends** Interface1> interface2Instance = interface1Instance.getInterface2ImplementorClass().newInstance();

但是当我想调用时出现异常

interface2Instance.execute(interface1Instance, second, third, forth);

我收到编译器错误:

The method execute(capture#3-of ? extends Interface1, OtherClass1, OtherClass2, OtherClass3) in the type Interface2<:capture#3-of ? extends Interface1> is not applicable for the arguments (Interface1, OtherClass1, OtherClass2, OtherClass3)

我找不到摆脱这种困惑的方法,我做错了什么,在哪里可以查找我违反的规则?

最佳答案

这样想:想象一下 Interface2ListInterface1Number 。您调用代码的方式 newInstance() 可以返回 List<Integer> (因为 Integer 扩展了 Number )但分配了 List<Integer>List<Number>是无效的。原因如下:

List<Integer> ints = new ArrayList<Integer>();
List<Number> nums = ints; //if this was possible
nums.add(2.0);
Integer first = ints.get(0); //then this would fail

其技术术语是协方差,您可以在 Angelika Langer's Generics FAQ 上阅读更多相关信息。 。简而言之,泛型类型不是协变的。

鉴于您缺乏具体细节,我不确定我是否可以提出修复建议。你可以有getInterface2ImplementorClass()返回 Class<? extends Interface2<Interface1>>而不是Class<? extends Interface2<? extends Interface1>> .

关于java - 再次泛型通配符。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059181/

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