我可以利用使用泛型的密封类的优点吗?

Júl*_*ira 5 generics types casting kotlin

我想创建一个通用的“查找”方法,该方法查找提供的实现密封类的实体并返回它,而不必重复多态性。

我想做这样的事情,但我还没有找到一种方法来满足我想要的一切并编译。

sealed class Spell(val id: Long)
class Fireball(id: Long, val name: String): Spell(id)
class Storm(id: Long, val size: String): Spell(id)

inline fun <reified T: Spell> find(id: Long): T =
    when (T) {
        Fireball -> Fireball(id, "fireball")
        Storm -> Storm(id, "3 acres")
    }

fun main() {
    find<Fireball>(3)
}
Run Code Online (Sandbox Code Playgroud)

And*_*ana 2

这个怎么样?

inline fun <reified T : Spell> find(id: Long): T =
    when (T::class) {
        Fireball::class -> Fireball(id, "fireball")
        Storm::class -> Storm(id, "3 acres")
        else -> throw IllegalStateException()
    } as T

Run Code Online (Sandbox Code Playgroud)

  • 当然,这可行,但当我向密封类添加条目时,我想中断编译,而不必处理默认情况,因为如果我对密封类子类型进行了详尽的说明,这种情况就永远不会发生。不管怎样,谢谢你的时间。 (2认同)