gpt4 book ai didi

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

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

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

类型不匹配:无法从 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;
}
}

最佳答案

使用以下内容:

Msg<? extends Value<?>> someMsg = strMsg;

问题是 ?Msg<Value<?>> objMsg 能够捕获转换。它不是“一些类型的MsgValue。它是“MsgValue 任何类型。

这也解释了为什么在声明更改的同时,我还将变量重命名为 someMsg . Value不能只是任何 Object .它必须属于一些类型(本例中为 String)。


一个更通用的例子

让我们考虑一个更通用的例子 List<List<?>> .类似于原始场景,List<List<?>> NOT 不能捕获转换 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"

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

  • Java 泛型是类型不变的
  • 有来自 Integer 的转化 Number ,而是一个 List< Integer >不是 List< Number >
    • 同样, List<Integer> 可以通过 List<?> 进行捕获转换,而是一个 List< List<Integer> >不是 List< List<?> >
  • 使用有界通配符,List<? extends  Number >可以捕获转换 List< Integer >
    • 同样,一个 List<? 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!

相关问题

另见

关于java - 无法使用泛型转换为非特定的嵌套类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46572320/

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