阅读Java 8的答案,它所说的一切也适用于Kotlin:
对Java语言的添加并没有使每个旧概念过时。实际上,Visitor模式非常擅长支持添加新操作。
Kotlin确实如此。与Java 8一样,它具有Lambda,SAM转换和允许默认实现的接口。
一种更改是,如果您要进行类实例类型检查,请使用Kotlin中的表达式,而不是if
对每次instanceof
检查使用大语句:when
在同一Stackoverflow页面上,使用不同的答案讨论了正在使用的Lambda,并显示if
了Java语句来确定要调用的Lambda。代替他们的Java示例:
if (animal instanceof Cat) {
catAction.accept((Cat) animal);
} else if (animal instanceof Dog) {
dogAction.accept((Dog) animal);
} else if (animal instanceof Fish) {
fishAction.accept((Fish) animal);
} else if (animal instanceof Bird) {
birdAction.accept((Bird) animal);
} else {
throw new AssertionError(animal.getClass());
}
使用此Kotlin:
when (animal) {
is Cat -> catAction.accept(animal)
is Dog -> dogAction.accept(animal)
is Fish -> fishAction.accept(animal)
is Bird -> birdAction.accept(animal)
else -> throw AssertionError(animal.javaClass)
}
在Kotlin中,您不需要进行强制转换,因为当编译器看到实例类型的检查时,会自动进行智能强制转换is
。
此外,在科特林可以使用密封类代表层次中的可能选项,然后编译器可以判断,如果你已经用尽了所有的情况下,这意味着你不需要else
在when
声明。
否则,该页面上的正确内容以及对同一问题的其他常见答案是对Kotlin的有益信息。我认为在Java 8,Scala或Kotlin中看到实际的文字访问者模式并不常见,而是使用lambda和/或模式匹配的变体。
其他相关文章:
when
而不是large if
)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句