我正在尝试理解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) { }
}
有人能用简单的语言解释一下正在发生什么吗?
List<?>
是一种类型(而?
不是)。因此,List<List<?>>
表示一个元素类型为List<?>
的List
,而List<?>
表示某种未知类型的List
。 - Paul BoddingtonList<?>
,则可以像第一个示例中那样将?
视为类型(捕获)。但是,如果你有一些嵌套类型,例如Map<?, List<?>>
,只有最外层类型中的通配符(因此是Map
而不是List
)可以被捕获。Boris 的答案展示了 为什么(我们可以做不安全的事情),但没有涉及 如何(捕获)。通配符在“外部”或“内部”类型中具有略微不同的语义。 - Radiodef