混合在集合中共享相同接口的不同枚举

时间:2018-03-27 01:55:10

标签: inheritance enums kotlin

出于某种原因,Kotlin将以下表达式评估为List Any而不是Animal,我该如何实现?

interface Animal
enum class Dog:Animal{
   WHITE;
}
enum class Cat:Animal{
   BLACK;
}
.............

fun loadAnimals(names:List<String>):List<???>{
    return names.map{
       when (/*some cond*/) {
        true -> Cat.Black
        else -> Dog.White
       }
     }
}

1 个答案:

答案 0 :(得分:1)

编译器如何推断它是Animal的列表?如果Dog还实现了Canine接口,该怎么办?如果Cat和Dog都实现了Carnivore接口怎么办?

如果您想返回Animal的列表,则需要在这种情况下转换返回值。

fun loadAnimals(names: List<String>): List<Animal> {
    return names.map {
        when (/*some cond*/) {
            true -> Cat.Black as Animal
            else -> Dog.White as Animal
        }
    }
}

或者像这样,没有演员:

fun loadAnimals(names: List<String>): List<Animal> {
    return names.map<String, Animal> {
        when (/*some cond*/) {
            true -> Cat.BLACK
            else -> Dog.WHITE
        }
    }
}