无法使用泛型转换为非特定嵌套类型

sta*_*ker 10 java generics casting

我有两个嵌套泛型的类.有没有办法摆脱

类型不匹配:无法转换Msg<Value<String>>Msg<Value<?>>错误?在最后一次任务中

public class Value<V> {
    V   val;

    public Value(V val) {
        this.val = val;
    }
    @Override
    public String toString() {
        return "" + val;
    }
}

public class Msg<T> {

    T holder;

    public Msg( T holder) {
        this.holder = holder ;
    }
    public String toString() {
        return "" + holder;
    }

    public static void main(String[] args) {
        Msg<Value<String>>strMsg = new Msg(new Value<String>("abc"));
        // This is OK
        Msg<?>objMsg = strMsg;
        // Type mismatch: cannot convert from Msg<Value<String>> to Msg<Value<?>>   
        Msg<Value<?>>objMsg = strMsg;
    }
}
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 18

使用以下内容:

Msg<? extends Value<?>> someMsg = strMsg;
Run Code Online (Sandbox Code Playgroud)

问题是,?Msg<Value<?>> objMsg不是能够捕获转换.这不是"一MsgValue某些类型.这是'一MsgValue任何类型’.

这也解释了为什么随着声明的变化,我也将变量重命名为someMsg.该Value不能只是任何Object.它必须属于某种类型(String在此示例中).


一个更通用的例子

让我们考虑一个更通用的例子List<List<?>>.类似于原来的场景中,List<List<?>>可以采集,转换List<List<Integer>>.

    List<List<Integer>> lolInt = null;

    List<List<?>> lolAnything = lolInt;         // DOES NOT COMPILE!!!
    // a list of "lists of anything"

    List<? extends List<?>> lolSomething = lolInt;   // compiles fine!
    // a list of "lists of something"
Run Code Online (Sandbox Code Playgroud)

这是另一种看待它的方式:

  • Java泛型是类型不变的
  • 有从转换IntegerNumber,但不是List<Integer>List<Number>
    • 类似地,a List<Integer>可以由a捕获转换List<?>,但a 不是aList<List<Integer>>List<List<?>>
  • 使用有界通配符,可以捕获转换aList<? extends?Number>List<Integer>
    • 同样,a 可以捕获转换aList<? extends?List<?>>List<List<Integer>>

有些人?可以捕获的事实和其他人也无法解释以下片段:

    List<List<?>> lolAnything = new ArrayList<List<?>>(); // compiles fine!

    List<?> listSomething = new ArrayList<?>(); // DOES NOT COMPILE!!!
        // cannot instantiate wildcard type with new!
Run Code Online (Sandbox Code Playgroud)

相关问题

也可以看看

  • +20 所有链接 (2认同)