在Kotlin中,我有一个默认实现的接口:
interface MyInterface {
fun foo() = "foo"
fun bar() = 120
}
因此,我正在尝试创建一个将MyInterface
作为参数的函数,或者如果未通过的话,则使用默认实现。
以下内容无法编译:
fun(param1: String, param2: Int, myInterface: MyInteface = MyInterface())
我该如何解决?
答案 0 :(得分:2)
创建一个实现该接口的类,并使用
class MyDefaultImplementation : MyInterface
fun(param1: String, param2: Int, myInterface: MyInterface = MyDefaultImplementation())
甚至更好的是,创建一个实现此接口的对象(单例),并将该对象用作默认值。
object MyDefaultImplementationObject : MyInterface
fun(param1: String, param2: Int, myInterface: MyInterface = MyDefaultImplementationObject)
答案 1 :(得分:1)
然后默认值必须是一个实现接口的对象...
class MyInterfaceImplementation: MyInterface
fun (param1: String, param2: Int, myInterface: MyInteface = MyInterfaceImplementation()) {
/* Function implementation */
}
答案 2 :(得分:1)
正如其他答案所说,您需要一个实现您的接口的对象。
也许最简单的创建方法是使用object : <ClassOrInterface>
语法:
fun myFun(param1: String, param2: Int, myInterface: MyInterface = object : MyInterface{}) {
// …
}
这可能会为使用默认*的每个调用创建一个新对象。如果那很重要,您可能要单独创建一个对象:
val defaultImpl = object : MyInterface
fun myFun(param1: String, param2: Int, myInterface: MyInterface = defaultImpl) {
// …
}
(* Kotlin 1.3.50似乎总是在每次使用默认值时创建一个新实例。但是该行为未在文档中指定,因此有可能在以后的版本中进行优化。 sup>