"?extends ParentClass"使只读?

Pra*_*uja 6 java generics null generic-list readonly-collection

在下面的代码Java中,我创建了一个列表nums.我可以在声明期间分配另一个列表.但是除了null.之外不能添加新项目.那么,这是否意味着nums只读?为什么?是否可以在该列表中添加新项目?

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);

List<? extends Number> nums = ints;
nums.add(3.14); //Generates error
nums.addAll(ints);  //Generates error

nums.add(null);     //works
System.out.println(nums.get(0));    //works
Run Code Online (Sandbox Code Playgroud)

我已经通过了这个链接.我无法得到确切的理由.

Jon*_*eet 6

是否可以在该列表中添加新项目?

不......因为那段代码不知道它是什么"实际"的列表.想象一下,如果你:

List<String> strings = new ArrayList<>();
List<? extends Object> objects = strings; // This is fine
objects.add(new Object()); // Fortunately this *isn't* valid...
System.out.println(strings.get(0).length()); // Or what would this do?
Run Code Online (Sandbox Code Playgroud)

基本上,当您使用通配符像? extends T你只能得到值通过API ...当你使用通配符一样? super T,你只能把这些值通过API -因为这是很安全的.

  • @PradipKharbuja:不,不是真的.列表本身不是只读的 - 你仍然可以通过`ints`添加它,或者通过`nums`删除它.由于类型安全,你不能*添加*到'nums`. (4认同)