我正准备OCJP。我在转储中找到了一个问题
import java.util.*;
public class G1 {
public void takeList(List<? extends String> list) {
// insert code here
}
}
在第6行独立插入的三个代码片段将被编译? (选择三项。)
A. list.add("foo");
B. Object o = list;
C. String s = list.get(0);
D. list = new ArrayList<String>();
E. list = new ArrayList<Object>();
答案:B,C,D
我有一个查询,如果List<? extends String
表示它与String类和String类的所有子类匹配。
有人可以证明这里显示的答案是正确的吗?
答案 0 :(得分:4)
A不正确,因为您的列表可能是List<SomeStringSubClass>
,因此向其添加字符串将无效。 (我知道String是最终的,但编译器在这里并不关心它。)
E不正确,因为List<Object>
无法分配给List<? extends String>
,因为List<Object>
包含的对象不一定是String类型或String的子类。
其他三个都可以:
List<? extends String>
包含String的实例或String的子类的实例。而sublcass的实例也是超类的一个实例。ArrayList<String>
是List<String>
,而List<String>
也是List<? extends String>
答案 1 :(得分:1)
A. `list.add("foo");`
无法编译,因为您只能将null
插入此列表
B. Object o = list;
编译,因为列表是一个对象
C. String s = list.get(0);
编译,因为列表中的每个元素都保证是字符串对象或它的理论子类(实际上不可能,因为String是最终类,不能扩展)。
D. list = new ArrayList<String>();
编译,因为列表中的每个元素都保证是一个字符串对象。
E. list = new ArrayList<Object>();
不会编译,因为不是每个对象都是字符串
Keep in mind that String is a final class and cannot be extended.
答案 2 :(得分:0)
List
是Object
,因此B有效。
列表中存储的内容可以向上转换为字符串,因此C有效。
在泛型中,“<? extends String>
”涵盖String
的子类,其中没有和字符串本身,因此D有效。
同样,“<? super String>
”表示String
或任何String's
继承树,例如Object
,CharSequence
,Serializable
等
答案 3 :(得分:0)
A不会编译,因为列表可能是扩展String的事物列表。泛型不会注意一个类是否是最终的。
一个更简单的例子是
public void takeList(List<? extends Number> list) {
// insert code here
list.add(1.0); // not allowed.
Number n = list.get(0); // allowed.
}
// you could call it with
takeList(new List<BigInteger>());