为何Java无法直接访问List<Object>索引元素属性而Groovy可以?
Java 不支持直接访问该属性的核心原因
核心差异来自两种语言的类型系统设计和语法规则区别:
- Java 是静态强类型语言,所有变量的类型在编译阶段就需要明确,编译器会严格校验变量所属类型是否定义了要访问的属性/方法,校验不通过直接报错。
你代码中调用path.getList("data.items")时如果没有指定泛型类型,返回的默认是List<Object>类型,调用get(0)得到的元素声明类型为java.lang.Object,而Object类本身没有定义companyId属性,因此编译器无法识别该属性,直接抛出错误。
如果要在 Java 中正常访问该属性,根据列表存储的元素类型有两种写法:
- 若列表存储的是自定义 Company 实体类实例,指定泛型后调用 getter 取值:
// 自定义Company类需提前定义companyId属性及对应getCompanyId()方法 List<Company> getDataItems = path.getList("data.items", Company.class); Integer companyId = getDataItems.get(0).getCompanyId();
- 若列表存储的是Map结构实例,调用Map的get方法取值:
List<Map> getDataItems = path.getList("data.items", Map.class); Integer companyId = (Integer) getDataItems.get(0).get("companyId");
- Groovy 是动态类型语言,属性访问属于运行时的动态语法糖:
编译阶段不会校验属性是否存在于变量的声明类型中,运行时会自动通过反射查找对应实例的companyId属性,或是匹配对应的getCompanyId()getter 方法、甚至支持Map结构直接用属性名访问键值,因此该写法可以正常执行。
内容的提问来源于stack exchange,提问作者brithwulf
相关产品推荐
相关产品推荐

