【问题标题】:Is there any equivalent of C#'s "default" keyword for Kotlin?Kotlin 是否有任何等效于 C# 的“默认”关键字?
【发布时间】:2020-04-11 15:13:27
【问题描述】:

代码示例:

import java.util.UUID

interface InterfaceOne<AType> {
    var abcOne:AType
}

interface InterfaceTwo<AType> {
    var abcTwo:AType
}

class Example<AType>: InterfaceOne<AType>, InterfaceTwo<AType> {

    override var abcOne: AType // Looking for default value to not from constructor 
    set(value) {
        field = value
        //...
    }

    override var abcTwo: AType // Looking for default value to not from constructor 
    set(value) {
        field = value
            //...
    }

   fun test(uuid: AType) {
       abcTwo = uuid
       abcOne = default // I'm looking for C#'s default keyword equivalent in here
   }
}

fun main() {

    val uuid = UUID.randomUUID()
    val uuid2 = UUID.randomUUID()

    val interfaceOne = Example<UUID>()

    interfaceOne.test(uuid)
}

您可以使用我的游乐场进行测试! Click here.

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

    我相信 Kotlin 没有等效的功能。 Kotlin 中没有 default literal。 Kotlin 不会将类字段初始化为任何默认值,甚至不会初始化原语(与 Java 不同,例如,int 被初始化为 0)。

    您要么必须在主构造函数中或在声明时初始化字段,要么使它们可以为空并保持未初始化 (null)。

    Kotlin 允许您在构造函数中为参数值指定默认值,但这需要是具体类的实例,因此不能考虑泛型。

    您可以使用工厂方法来生成默认值:

    class Example<AType>(val factory: () -> AType): InterfaceOne<AType>, InterfaceTwo<AType> {
    
        override var abcOne: AType = factory()
    
        override var abcTwo: AType = factory()
    
        fun test(uuid: AType) {
            abcTwo = uuid
            abcOne = factory()
            println("abcOne=$abcOne")
            println("abcTwo=$abcTwo")
        }
    }
    
    fun main() {
    
        val uuid = UUID.randomUUID()
        val uuidExample = Example<UUID>({UUID.randomUUID()})
        uuidExample.test(uuid)
    
        val stringExample = Example<String>({"default"})
        stringExample.test("two")
    }
    

    【讨论】:

    • 达里奥你好!谢谢你回复我的问题!我已经想到了主构造函数,但是如果 AType 考虑“类类型”或“对象”或“原始类型”,我应该如何将这些对象设为默认初始化?你有什么建议?如果你有时间,你愿意在代码中给我看吗?如果你这样做,我会很高兴你。谢谢!
    • 您可以做的一件事是将一个函数传递给您的类,该函数返回一个“detault”值。看看这个answer。我还将用一些代码编辑我的答案。
    • 感谢您的代码!我有另一个问题。这个实现可以作为“注释”来实现吗?例如,有一个名为“DefaultInitializer”的注释,它的目标是“AnnotationTarget.CLASS”类型、“AnnotationTarget.PROPERTY”、“AnnotationTarget.FIELD”和“AnnotationTarget.TYPEALIAS”等。这有意义吗?你有什么看法?
    • 不客气。我认为您不能将工厂放在注释中。你可以把它放在另一个接口中:interface DefaultValueFactory&lt;AType&gt; {val factory: () -&gt; AType}.
    猜你喜欢
    • 2011-01-01
    • 2019-11-09
    • 2011-01-15
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多