Java Can';t转换为带有泛型的非特定嵌套类型

Java Can';t转换为带有泛型的非特定嵌套类型,java,generics,casting,Java,Generics,Casting,我有两个嵌套泛型的类。有没有办法摆脱这个问题 类型不匹配:无法从Msg转换为MsgobjMsg=strMsg; //类型不匹配:无法从Msg转换为Msg>objMsg=strMsg; } } 不是一个直接的答案,但我强烈建议阅读:以更好地理解泛型。使用以下内容: Msg<? extends Value<?>> someMsg = strMsg; 下面是另一种看待它的方式: Java泛型是类型不变的 有一个从整数到数字的转换,但是列表不是列表 类似地,列表可以通过列表

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

类型不匹配:无法从
Msg
转换为
MsgobjMsg=strMsg;
//类型不匹配:无法从Msg转换为Msg>objMsg=strMsg;
}
}

不是一个直接的答案,但我强烈建议阅读:以更好地理解泛型。

使用以下内容:

Msg<? extends Value<?>> someMsg = strMsg;
下面是另一种看待它的方式:

  • Java泛型是类型不变的
  • 有一个从
    整数
    数字
    的转换,但是
    列表
    不是
    列表
    • 类似地,
      列表
      可以通过
      列表
      捕获转换,但是
      列表
      不是
      列表
      可以捕获转换
      列表
一些
可以捕获,而另一些不能捕获,这一事实也解释了以下代码片段:

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

    List<?> listSomething = new ArrayList<?>(); // DOES NOT COMPILE!!!
        // cannot instantiate wildcard type with new!
List>();//编译得很好!
List listSomething=new ArrayList();//不编译!!!
//无法用new实例化通配符类型!
相关问题
    • 对这个问题进行了很长很详细的探讨
另见
    • ||

尽管泛型类型参数包含通配符,但它本身不是通配符。当使用非通配符泛型类型
T
分配给变量(
Msg
)时,被分配的对象必须将
T
作为其泛型类型(包括
T
的所有泛型类型参数、通配符和非通配符)。在您的情况下,
T
Value
,它与
Value
的类型不同

由于
可分配给
,因此可以使用通配符类型:

Msg<? extends Value<?>> a = new Msg<Value<String>>();
Msg>a=newmsg();

ILMTitan有一个很好的解决方案,如果您不想让类特定于值,那么此时最好使用基类型而不是泛型,因为您将关闭安全功能,但有一种方法。您甚至可以传递一个参数,使此方法更通用,但键是“@SuppressWarnings”

@SuppressWarnings(“未选中”)

Msg我的答案与另一个类似,但希望更清楚

List<List<?>> is a list of (lists of anything).

List<List<String>> is a list of (lists of strings).

<代码> ListHave。您尝试添加一个显式强制转换,以查看是否可以至少找出一个更好的类型错误?@ GyYes,同样的错误消息,您可能需要考虑类型推断<代码>静态< /代码>工厂方法,而不是构造函数;这样,您就不必每次使用
new
时都参数化
Msg
Value
。请注意,您忘记在原始代码段中参数化
new Msg
,而是使用了原始类型。查看此问题以了解推断
静态
工厂方法可以为您提供什么类型:@polygene感谢您的回答,我将对此进行检查如果
消息
,这将无法编译。这不是未经检查的演员阵容。这是一个直接的非法演员。这就像试图将所有链接的
字符串
转换为
整数
+20
Msg<? extends Value<?>> a = new Msg<Value<String>>();
@SuppressWarnings("unchecked")
Msg<Value<?>> convert()
{
    return (Msg<Value<?>>) this;
}
List<List<?>> is a list of (lists of anything).

List<List<String>> is a list of (lists of strings).