为什么说List 不隶属于List
在 Java 中,泛型是不可协变的,这意味着 List<String>
并不是 List<Object>
的子类型。这样的设计是为了保护你免受无意引入错误的危险。
假设 Java 允许这样的协变,那么你可能会遇到以下情况:
javaCopy code
List<String> stringList = new ArrayList<>(); List<Object> objectList = stringList; // 假设这是合法的 objectList.add(new Object()); // 这将在运行时出错,因为你试图在 String 类型的列表中添加一个 Object 类型的元素 String s = stringList.get(0); // 类型错误
在这个例子中,如果 Java 允许 List<String>
是 List<Object>
的子类型,那么你就可以将一个 Object
类型的元素添加到 String
类型的列表中,这在运行时将导致错误。为了避免这种情况,Java 的泛型设计为不可协变。
但是,Java 提供了一种方式来创建一个只读的 List<Object>
,这样就可以接受 List<String>
了。你可以使用通配符来创建一个只读的 List<Object>
:
javaCopy code
List<String> stringList = new ArrayList<>(); List<?> objectList = stringList; // 这是合法的
在这种情况下,objectList
是只读的,你不能向其添加任何类型的对象。这种方式提供了某种形式的协变性,同时也避免了类型错误。