我有一个未初始化任何参数的List。我将Map<String, Object>
添加到该列表中。
然后我创建了一个User
对象,并且我知道在编译时将列表类型转换为List<User>
后。
但是我很惊讶,我在运行时也没有得到这些错误。
举个例子,代码如下:
我以为会有错误List<User> users = (List<User>) list;
相反,列表users
仍然是list
下面的代码运行得很好。
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class User {
private String name;
public String getName(){
return name;
}
}
public class Main {
public static void main(String[] args) {
Map<String, Object> map1 = new HashMap<>();
map1.put("name", "Bruce");
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "Clark");
List list = List.of(map1, map2);
List<User> users = (List<User>) list;
System.out.println(users.get(0) instanceof Map);
}
}
输出:
true
我在这里错过了什么?
另外,当我试图从上述users
列表访问对象时,我确实得到ClassCastException。
例如,如果我做users.get(0).getName()
,我得到一个很好的ClassCastException
java.lang.ClassCastException: class java.util.HashMap cannot be cast to class User
但在此之前没有
所以users.get(0)
仍然是HashMap
有人能解释一下为什么会这样吗?
对于第一个前泛型用法(list
),编译器不再执行类型安全的泛型。
List list = List.of(map1, map2);
List<User> users = (List<User>) list;
System.out.println(users.get(0) instanceof Map);
所以users
就是Object
的List
。
(泛型强制转换不是真正的强制转换,为编译器提供了更多的元数据,而不是代码承载-因为运行时的类型擦除。)