繁体   English   中英

泛型通配符再次。

[英]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)

我找不到摆脱这种混乱的出路,我错了什么?在哪里可以查到我要打破的规则?

这样想:想象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的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.

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