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

Has*_*hra 3 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());
Run Code Online (Sandbox Code Playgroud)

输出是:

com.vo.ErrorInfoVO
com.vo.ErrorInfoVO
java.util.HashMap
Exception in thread "main" java.lang.NullPointerException:
Run Code Online (Sandbox Code Playgroud)

为什么obj2.class返回 null ?

Szy*_*iak 6

你得到NullPointerException因为

obj2.class
Run Code Online (Sandbox Code Playgroud)

不会翻译成

obj2.getClass()
Run Code Online (Sandbox Code Playgroud)

而是为了

obj2.get("class")
Run Code Online (Sandbox Code Playgroud)

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

此用例在 Groovy 文档页面使用集合 2.2 中进行了描述。地图属性符号

注意:按设计map.foo将始终foo在地图中查找密钥。这意味着foo.classnull在不包含类键的地图上返回。如果你真的想知道这个类,那么你必须使用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
Run Code Online (Sandbox Code Playgroud)