Kotlin中共享Animal接口的枚举类混合集合,如何让返回类型为Animal而非Any?
解决Kotlin中枚举类集合类型推断为List的问题
这个问题我之前开发时也碰到过,Kotlin的类型推断在这里确实需要一点引导——虽然Cat和Dog都实现了Animal接口,但编译器默认不会自动把它们的共同父类锁定为Animal,反而会推断成最宽泛的Any。下面是两种简单的解决方法:
方法一:给map函数指定泛型参数
直接在map后面加上<Animal>,明确告诉编译器我们要生成一个Animal类型的集合:
interface Animal enum class Dog : Animal { WHITE } enum class Cat : Animal { BLACK } fun loadAnimals(names: List<String>): List<Animal> { return names.map<Animal> { when (/* 你的判断条件,比如 it == "cat" */) { true -> Cat.BLACK else -> Dog.WHITE } } }
方法二:给when表达式的结果显式声明类型
在when外面声明一个Animal类型的变量,让编译器明确分支返回值的类型:
fun loadAnimals(names: List<String>): List<Animal> { return names.map { val animal: Animal = when (/* 你的判断条件 */) { true -> Cat.BLACK else -> Dog.WHITE } animal } }
为什么会出现这个问题?
因为Cat和Dog作为枚举类,除了实现Animal接口外,还继承了Enum<Cat>和Enum<Dog>(泛型参数不同),它们的共同超类型包括Animal、Enum<*>和Any。编译器在没有明确提示的情况下,会选择最宽泛的Any作为推断结果,所以我们需要手动引导它选择Animal。
内容的提问来源于stack exchange,提问作者Casper
相关产品推荐
相关产品推荐

