Java没有为非参数化列表抛出ClassCastException



我有一个未初始化任何参数的List。我将Map<String, Object>添加到该列表中。

然后我创建了一个User对象,并且我知道在编译时将列表类型转换为List<User>后。

但是我很惊讶,我在运行时也没有得到这些错误。

举个例子,代码如下:

我以为会有错误List<User> users = (List<User>) list;

相反,列表users仍然是list<String,>>

下面的代码运行得很好。

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就是ObjectList

(泛型强制转换不是真正的强制转换,为编译器提供了更多的元数据,而不是代码承载-因为运行时的类型擦除。)

最新更新