Groovy找不到匹配的构造函数?

Dir*_*oys 1 syntax groovy mongodb runtimeexception morphia

请注意:虽然这个问题提到了Mongo,但它肯定是一个纯粹的Groovy问题.

我的MyApp#bootstrap方法:

def bootstrap(AppConfiguration config) {
    String h = config.dbHost
    String p = config.dbPort

    println "Mongo is at: ${h}:${p}."

    dao = new MongoDao(host: h, port: p)
}
Run Code Online (Sandbox Code Playgroud)

我的MongoDao班级(片段):

class MongoDao implements BasicDao {
    String dbName
    Mongo mongo
    String host
    String port
    Morphia morphia
    Datastore datastore

    MongoDao(String host, String port) {
        this.dbName = "db_myapp"
        this.mongo = new Mongo(host, port)
        this.morphia = new Morphia()
        this.datastore = morphia.createDatastore(mongo, dbName)

        morphia.mapPackage("myappdb.common")
    }
}
Run Code Online (Sandbox Code Playgroud)

当此bootstrap()方法运行时,我得到以下异常:

Mongo is at: mymongo01:27017.
Exception in thread "main" groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.me.myapp.dao.MongoDao(java.util.LinkedHashMap)
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1601)
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1404)
    at org.codehaus.groovy.runtime.callsite.MetaClassConstructorSite.callConstructor(MetaClassConstructorSite.java:46)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?怎么主机/端口被读入并打印到STDOUT只是找到但是当我们构造DAO时,它们神奇地变成了LinkedHashMap

inj*_*eer 10

如果你想调用一个名为args的构造函数,你的类必须提供一个无参数的构造函数.

在你的情况下,我会去接下来的电话:

dao = new MongoDao( h, p )
Run Code Online (Sandbox Code Playgroud)

因为这个构造函数正在做一些工作

  • @Zac,因为我敢肯定我们很多来自例如python的人都会发现这种奇怪的现象:`new Cls(x:1,y:2)`不会被命名参数调用(例如python`somefunc(x,y = 1) ,a = 6)`),但它是new Cls([x:1,y:2])`的缩写(所以这是一张地图),它将使用`ctor()`构造并调用setter / sets使用给定地图的属性。 (3认同)