有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java扩展数据类密封类kotlin

我有一个密封的类,它有不同的子类型。当我试图使用When子句过滤出一个子类型时,我总是得到未解析的引用“name”

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子句中过滤并构建自定义对象


共 (1) 个答案

  1. # 1 楼答案

    正如@rajan正确解释的那样。kali APPLE是一个对象,因此您可以直接访问name。但是,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方法可以用一种更为科特利尼的方式编写:

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