扩展数据类密封类kotlin

时间:2021-02-22 10:05:18

标签: java android kotlin sealed-class

我有一个密封类,它具有从它扩展的不同子类型。当我尝试使用 when 子句过滤掉子类型时,我不断收到未解析的引用“名称”

sealed class Fruit(val name: String) {
    object APPLE : Fruit(“apple”)

    data class BANANA(val isFruit: Boolean) : Fruit(“banana”)
}


internal object Random {
   fun build(name: String): FruitNinja{
     when(name) {
       Fruit.APPLE.name -> {
        
         return AppleFruitNinja()
       }
       // keep getting error here Unresolved reference: name
       Fruit.BANANA.name-> {
         return BananaFruitNinja()
       }
     }
    }
   }

如何使用“name”参数在 when 子句中进行过滤并构建自定义对象。

2 个答案:

答案 0 :(得分:2)

您不能使用 class 名称访问成员变量,因为 Apple 是对象,您可以使用 name 运算符直接访问 . 但因为 BANANA 是一个类,您需要在访问 name 之前创建实例

internal object Random {
    fun build(name: String): FruitNinja{
        when(name) {
            Fruit.APPLE.name -> {

                return AppleFruitNinja()
            }
            Fruit.BANANA(true).name -> {
                return BananaFruitNinja()
            }
        }
    }
}

答案 1 :(得分:2)

正如@rajan.kali 正确解释的那样,APPLE 是一个对象,因此您可以直接访问名称。但是,BANANA 是一个类,因此您需要创建该类的一个实例,或者我建议创建一个伴随对象:

sealed class Fruit(val name: String) {
    object APPLE : Fruit("apple")

    data class BANANA(val isFruit: Boolean) : Fruit(name) {
        companion object { 
            const val name = "banana" 
        }
    }
}

然后你就可以像苹果一样使用它了:

internal object Random {
    fun build(name: String): FruitNinja {
        when (name) {
            Fruit.APPLE.name -> {
                return AppleFruitNinja()
            }
            Fruit.BANANA.name -> {
                return BananaFruitNinja()
            }
        }
    }
}

最后一点,build 方法可以用更 kotliny 的方式编写:

internal object Random {
    fun build(name: String): FruitNinja = when (name) {
        Fruit.APPLE.name -> AppleFruitNinja()
        Fruit.BANANA.name -> BananaFruitNinja()
        else -> TODO()
    }
}