为什么在Groovy中Map.class返回null?

时间:2019-04-26 10:59:31

标签: groovy

我在Groovy中有一段简单的代码:

ErrorInfoVO vo = new ErrorInfoVO();
Object obj1 = vo;
System.out.println(obj1.class.getName());
System.out.println(obj1.getClass().getName());

Map map = new HashMap()
Object obj2 = map
System.out.println(obj2.getClass().getName());
System.out.println(obj2.class.getName());

输出为:

com.vo.ErrorInfoVO
com.vo.ErrorInfoVO
java.util.HashMap
Exception in thread "main" java.lang.NullPointerException:

为什么obj2.class返回空值?

1 个答案:

答案 0 :(得分:4)

您之所以得到NullPointerException是因为

obj2.class

不翻译为

obj2.getClass()

而是

obj2.get("class")

这是因为在您的案例中,obj2的类型为Map,并且您使用了属性符号。这意味着obj2.class返回与名为class的键相关联的值,并且与该键相关联的键值条目在您的映射中不存在,因此它返回null。然后,您调用getName()方法,并得到NullPointerException

该用例在Groovy文档页面Working with collections, 2.2. Map property notation中进行了描述:

  

注意:根据设计map.foo,将始终在地图中查找键foo。这意味着foo.class将在不包含类密钥的地图上返回null。如果您真的想了解该类,则必须使用getClass()

def map = [name: 'Gromit', likes: 'cheese', id: 1234]
assert map.class == null
assert map.get('class') == null
assert map.getClass() == LinkedHashMap // this is probably what you want