gpt4 book ai didi

kotlin - 有没有一种优雅的方法来检查对象的类型是否属于类型列表?

转载 作者:行者123 更新时间:2023-12-04 15:10:00 30 4
gpt4 key购买 nike

使用字符串时,您可以检查字符串是否属于这样的字符串集:

if (a in listOf("ab", "abab")) {
// do something
}
或者:
when (a) {
in listOf("akshd", "sd") -> {
// do something
}
}
现在,让我们假设您有一个密封类:
sealed class SealedClass {
class Subclass1 : SealedClass()
class Subclass2 : SealedClass()
class Subclass3 : SealedClass()
}
有一个很好的方法来检查某个对象是否存在 b属于这些类型的子集。如果您使用 when表达式你可以这样写:
when (b) {
is SealedClass.Subclass1, is SealedClass.Subclass2 -> {
// do something
}
}
如果您想使用 if,事情会变得复杂起来表达。你可以这样写:
if (b is SealedClass.Subclass1 || b is SealedClass.Subclass2) {
// do something
}
或这个:
if (
b::class in listOf(
SealedClass.Subclass1::class,
SealedClass.Subclass2::class
)
) {
// do something
}
上述两种解决方案都非常笨拙。
使用 if 时是否有更优雅的方式来表达这样的检查?陈述?

最佳答案

我不相信有办法解决这个问题。
创建自定义解决方案可能会适得其反,因为类型安全将是一个问题。如果使用了不兼容的类型,代码将运行,但您可能会以运行时错误结束。但是,如果您使用 is直接你会得到一个编译时错误,说“不兼容的类型”。
解决此问题的干净方法是在密封类中为此创建一个方法或属性。通过正确的命名,代码将更容易阅读。例如:

sealed class Animal {
class Cat : Animal()
class Dog : Animal()
class Tiger : Animal()

val isDomestic
get() = this is Cat || this is Dog
}
用法:
if (animal.isDomestic) {
// do something
}

关于kotlin - 有没有一种优雅的方法来检查对象的类型是否属于类型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65364290/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com