【发布时间】:2014-12-14 01:10:12
【问题描述】:
我正在尝试理解 Java 泛型,但它们似乎非常难以理解。比如这样就可以了……
public class Main {
public static void main(String[] args) {
List<?> list = null;
method(list);
}
public static <T> void method(List<T> list) { }
}
……原来如此……
public class Main {
public static void main(String[] args) {
List<List<?>> list = null;
method(list);
}
public static <T> void method(List<T> list) { }
}
...还有这个...
public class Main {
public static void main(String[] args) {
List<List<List<?>>> list = null;
method(list);
}
public static <T> void method(List<List<T>> list) { }
}
...但这不能编译:
public class Main {
public static void main(String[] args) {
List<List<?>> list = null;
method(list);
}
public static <T> void method(List<List<T>> list) { }
}
有人可以用简单的语言解释发生了什么吗?
【问题讨论】:
-
只是好奇,鲍里斯的回答是否足够,或者您对此仍然持怀疑态度?
-
@Radiodef 我现在对此一点也不怀疑。花了一段时间,但我终于明白了。自从我写这个问题以来,我一直在回答大量的泛型问题!
-
好的,没问题。 ; ) 我看到了 cmets 并考虑写一些额外的东西。这种情况并不经常出现。 "Capture conversion is not applied recursively." 只能捕获第一个示例中的通配符。
-
@Radiodef 对我来说,关键是当我终于明白
List<?>是一种类型(而?不是)。所以List<List<?>>表示List,其元素的类型为List<?>,而List<?>表示List某种未知类型。 -
是的,这里错误的性质是:如果你有一个
List<?>?可以像类型(捕获)一样处理第一个例子。但是如果你有一些像Map<?, List<?>>这样的嵌套类型,则只能捕获“最外层”类型中的通配符(因此Map而不是List)可以被捕获。 Boris 的回答说明了 why(我们可以做不安全的事情),但没有说明 how(捕获)的细节。通配符的语义略有不同,具体取决于它是“外部”还是“内部”类型。
标签: java generics types wildcard