我从Java转到Kotlin,对Kotlin还不太熟悉。我正在尝试创建用于单元测试目的的声明式DSL。这是我创建通用构建器方法以使用声明式语法构建任何模型对象的尝试。
fun <T> having(t: Class<T>) = object {
infix fun with(fn: T.() -> Unit) = t.newInstance().apply(fn)
}
fun test() {
having(Pizza::class.java) with {
size = Size.NORMAL
cheese = Cheese.MOZARELLA
}
}
然而,
having
函数返回 Any
类型,并且与 with
函数存在未解决的引用。我可以将匿名对象提取到它自己的类中以使其编译,但这会感觉很冗余。是否有可能使用返回 object
实例的函数进行类型推断?此外,我不确定我在这里是否以惯用方式使用泛型。
having
变成一个private
函数,但我认为这对您来说可能不太理想。我建议您为此对象创建一个新类。 - SweeperPizza().apply { ... }
吗?你是否考虑过其他语法形式,比如Pizza::class.with { ... }
或者Pizza::class with { ... }
?基本上,我不明白having
调用的目的是什么。 - SweeperPizza::class.with { ... }
的语法,但我不确定如何将泛型扩展方法添加到class
实例化类中。 - Tuomas Toivonen