我有这个 MappedSuperClass
@MappedSuperclass
abstract class BaseFoo(
...
) : FooItem {
...
}
sealed interface FooItem
然后像这样使用
@Entity
@Table(name = "bar_1")
class Bar1(
...
) : BaseFoo(
...
) { ... }
@Entity
@Table(name = "bar_2")
class Bar2(
...
) : BaseFoo(
...
) { ... }
@Entity
@Table(name = "all_bar")
class AllBar(
...
@OneToMany(mappedBy = "all_bar", fetch = FetchType.LAZY, cascade = [CascadeType.REMOVE])
val bar1: List<Bar1>? = null,
@OneToMany(mappedBy = "all_bar", fetch = FetchType.LAZY, cascade = [CascadeType.REMOVE])
val bar2: List<Bar2>? = null,
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
val barItems: List<FooItem>
get() = listOfNotNull(bar1, bar2).flatten()
}
然后我想添加一个详尽的 when 语句
val bars = allBarRepository.findById(someId).getOrElse {...}
bars.barItems.forEach {
when (it) {
is Bar1 -> ...
is Bar2 -> ...
}
但是编译器说
‘when’ 表达式必须详尽无遗,请添加必要的‘is BaseFoo’ 分支或‘else’ 分支
我不想检查BaseFoo
,而只想检查Bar1
和Bar2
以及将来是否Bar_<INT>
会添加所有其他 Bar。我希望当我忘记添加任何内容时,编译器会发出警告Bar_<INT>
。通过添加else
分支或检查BaseFoo
这不再有效。我认为这sealed interfaces
可以用于什么?
BaseFoo
也应该如此sealed
。sealed
类是隐式的abstract
,但只有 的类abstract
不是sealed
。它们“打开”层次结构,并且可能有其他类继承自BaseFoo
。有点离题,但 Java 的密封接口/类要求您指定每个子类是否为
sealed
// 。我建议在编写 Kotlin 时也牢记这一点。non-sealed
相当于在 Kotlin 中没有修饰符。final
non-sealed