[英]Generics wildcards again.
我遇到以下异常,试图在接口中引入一些泛型(将实际代码简化为一般示例):
Type mismatch: cannot convert from capture#1-of ? extends Interface2<:? extends Interface1> to Interface2<:Interface1>
失败的呼叫是:
Interface2<Interface1> interface2Instance = interface1Instance.getInterface2ImplementorClass().newInstance();
这些是接口定义:
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)
我找不到摆脱这种混乱的出路,我错了什么?在哪里可以查到我要打破的规则?
这样想:想象Interface2
是List
而Interface1
是Number
。 调用代码的方式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的Generics FAQ上阅读有关它的更多信息。 简而言之,泛型类型不是协变的。
鉴于您缺乏具体细节,我不确定我是否可以建议修复方案。 您可以让getInterface2ImplementorClass()
返回Class<? extends Interface2<Interface1>>
Class<? extends Interface2<Interface1>>
而不是Class<? extends Interface2<? extends Interface1>>
Class<? extends Interface2<? extends Interface1>>
Class<? extends Interface2<? extends Interface1>>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.