【发布时间】:2014-09-11 18:16:14
【问题描述】:
给定:
import java.util.*;
public class Hancock {
//insert code here
list.add("foo");
}
}
在第 5 行独立插入的哪两个代码片段在编译时不会出现警告? (选择两项)
A. public void addString(List list) {
B. public void addString(List<String> list) {
C. public void addString(List<? super String> list) {
D. public void addString(List<? extends String> list) {
正确答案是 B 和 C。
答案 A 和 B 对我来说很清楚。对于 C 和 D 的答案,我知道继承的方向,但是我不明白为什么答案 D 不能在 Eclipse 中编译,而所有其他答案都可以(A 警告泛型,B 和 C 没有警告)。
Eclipse 中答案 D 的错误是 The method add(capture#1-of ? extends String) in the type List<capture#1-of ? extends String> is not applicable for the arguments (String)。
另一方面,它编译:
public void addString() {
List<? extends String> list1 = new ArrayList<String>();
List<? super String> list2 = new ArrayList<String>();
}
为什么?为什么<? super String> 在方法声明中不编译,而在变量声明中编译。
我知道String 是最终类,不能被任何其他类扩展,但这并不能向我解释这里发生了什么。
【问题讨论】:
标签: java generics collections extends super