我是这些泛型类型的新手。在下面的代码中,我创建了一个方法,该方法接受扩展了“字符串”的项目列表。
我的问题?-当列表可以分配一个新列表时,为什么不能添加字符串“ test” …这给了我一个编译错误。
public class Child { public void takeList(List<? extends String> list){ list = new ArrayList<String>(); list.add("test"); } }
因为与此处无关的不是运行时类型。list仍然是类型List<? extends String>,您刚巧将其分配给new ArrayList<String>()。考虑一下:
list
List<? extends String>
new ArrayList<String>()
list = rand() ? new ArrayList<String>() : new ArrayList<NotString>();
编译器无法确定其是否list.add("test")有效-它仅基于的编译时类型进行决策list。
list.add("test")
请注意,实际上没有任何扩展String,这是一个final类。
String
final