【发布时间】:2019-05-30 23:09:04
【问题描述】:
这与其说是代码出了什么问题,不如说是java为什么允许这段代码工作?
使用 com.fasterxml.jackson.databind.ObjectMapper 可以创建一个列表,其中填充的数据类型对于声明的列表应该是无效的。
我告诉它将List<Potato> 转换为List<Potato> 并将结果存储在List<Tractor> 中
public class ObjectMapperExample {
public static void main(String[] args){
List<Potato> potatoList = new ArrayList<>();
//add a potato to the potatoList
List<Tractor> tractorList = new ObjectMapper()
.convertValue(potatoList, new TypeReference<List<Potato>>() {});
//add another tractor to the tractorList
System.out.println(tractorList.getClass());
System.out.println(tractorList.toString());
System.out.println(tractorList.get(1).getClass());
System.out.println(tractorList.get(0).getClass());
}
}
土豆类
public class Potato {
// properties and getters/setters
}
拖拉机.class
public class Tractor {
// properties and getters/setters
}
此代码实际上会编译并运行,直到您尝试直接与tractorList 中的Potato 对象交互。结果输出...
类 java.util.ArrayList
[土豆@20e2cbe0,拖拉机@68be2bc2]
类拖拉机
线程“main”java.lang.ClassCastException 中的异常:无法在 ObjectMapperExample.main(ObjectMapperExample.java:27) 处将土豆转换为 Tractor
所以问题是,为什么 java 仍然运行它?具有Potato 对象的List<Tractor> 不应该作为第一个元素在某处引发异常吗?直接访问元素时会抛出异常,这是有道理的,但是它是如何设法创建一个具有不兼容对象类型的 List 开始的呢?
【问题讨论】:
标签: java objectmapper