加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:20:25 所属栏目:Java 来源:网络整理
导读:我有两个嵌套泛型的类.有没有办法摆脱 类型不匹配:无法从Msg Value String转换到Msg Value?错误? 在最后一次任务中 public class ValueV { V val; public Value(V val) { this.val = val; } @Override public String toString() { return "" + val; }}pub
我有两个嵌套泛型的类.有没有办法摆脱

类型不匹配:无法从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无法捕获转换.它不是“某种类型的价值信息.它是”任何类型的价值信息“.

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

一个更通用的例子

让我们考虑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"

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

> Java泛型是类型不变的
>有一个从整数到数字的转换,但是一个List< Integer>不是List< Number>

>类似地,List< Integer>可以通过List<?>进行捕获转换,但是List< List< Integer>>不是列表< List<?>>

>使用有界通配符,List<?延伸编号>可以捕获转换List< Integer>

>同样,列表<?延伸列表??与LT;?>>可以捕获转换列表< List< Integer>>

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

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

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

相关问题

> Multiple wildcards on a generic methods makes Java compiler (and me!) very confused

>对这个问题进行了非常详尽的探索

> Java Generic List<List<? extends Number>>
> Any simple way to explain why I cannot do List<Animal> animals = new ArrayList<Dog>()?
> What is the difference between <E extends Number> and <Number>?

也可以看看

> Java Generics Tutorial

> Generics and Subtyping | Wildcards | More Fun with Wildcards

> Angelika Langer’s Java Generics FAQ

> What is a bounded wildcard?
> Which super-subtype relationships exist among instantiations of generic types?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读