java – 无法使用泛型转换为非特定的嵌套类型
我有两个嵌套泛型的类.有没有办法摆脱
类型不匹配:无法从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<?>进行捕获转换,但是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 也可以看看 > Java Generics Tutorial > Generics and Subtyping | Wildcards | More Fun with Wildcards > Angelika Langer’s Java Generics FAQ > What is a bounded wildcard? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |