Groovy匿名类实例化报找不到匹配构造函数的问题如何解决
问题根因
Groovy对普通具名类和匿名类的构造传参逻辑不一致,本质是语法糖的覆盖范围差异:
- 实例化普通具名类(比如示例代码中的
B)时,传入键:值格式的Map参数属于Groovy的默认语法糖:Groovy会先调用类的无参构造,再自动将Map内的键值对对应赋值给类属性,因此不需要类显式声明接收Map的构造函数。 - 实例化匿名类(也就是
new A() {}这种写法)时,上述语法糖不生效,括号内的所有参数会直接作为入参匹配父类的构造函数。你定义的A类没有显式声明接收Map类型入参的构造函数,因此抛出找不到对应构造的异常。
解决方法
方法1:修改父类,显式声明支持Map入参的构造
你可以手动添加兼容Map的构造,也可以直接用Groovy自带的注解自动生成:
// 写法1:手动加构造 class A { int data A(Map m = [:]) { m.each { key, value -> this[key as String] = value } } } // 写法2:用@Canonical注解自动生成所需构造,更简洁 import groovy.transform.Canonical @Canonical class A { int data }
修改后def o2 = new A(data:1) {}即可正常运行。
方法2:匿名类内用实例初始化块赋值
不需要修改原有父类代码,直接在匿名类的初始化块里给属性赋值:
def o2 = new A() { { data = 1 } }
方法3:实例化后单独赋值属性
逻辑最直白,不需要额外改动:
def o2 = new A() {} o2.data = 1
内容的提问来源于stack exchange,提问作者link89
相关产品推荐
相关产品推荐

