背景
枚举因为无法使用继承,所以定义的枚举变量里如果要体现层级关系或者包含关系,需要通过接口来实现。
参考
代码实现
//枚举类
interface Food {
enum class EastFood : Food {
noodle,baozi
}
enum class WestFood : Food {
piza
}
}
//test调用
fun test() {
Log.d("enum_test", "enum_test")
val p: Food = Food.EastFood.noodle
if(p is Food){
Log.d("enum_test", "p is class Food")
}else{
Log.d("enum_test", "p is not class Food")
}
//kotlin的when 将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。
//这里when需要使用同一层级的标准判断,如如果两个分支都符合,满足前一个分支就退出了
when (p) {
is Food.EastFood -> { Log.d("enum_test", "p is class Food.EastFood")}
is Food.WestFood -> {Log.d("enum_test", "p is class Food.WestFood")}
Food.EastFood.noodle -> {Log.d("enum_test", "p: Food.EastFood.noodle")}
Food.EastFood.baozi -> {Log.d("enum_test", "p: Food.EastFood.baozi")}
Food.WestFood.piza -> {Log.d("enum_test", "p: Food.WestFood.piza")}
else ->{Log.d("enum_test", "nothing")}
}
when (p) {
is Food.EastFood -> { Log.d("enum_test", "p is class Food.EastFood")}
is Food.WestFood -> {Log.d("enum_test", "p is class Food.WestFood")}
else ->{Log.d("enum_test", "nothing")}
}
when (p) {
Food.EastFood.noodle -> {Log.d("enum_test", "p: Food.EastFood.noodle")}
Food.EastFood.baozi -> {Log.d("enum_test", "p: Food.EastFood.baozi")}
Food.WestFood.piza -> {Log.d("enum_test", "p: Food.WestFood.piza")}
else ->{Log.d("enum_test", "nothing")}
}
}
结果
总结
枚举如何继承:
Java 中 Enum 如何继承?:
Enum的本质语义是把一个类的多个实例直接列举出来。
而继承是类的行为, 不是实例的行为。
因为在语义设计上不能被继承,所以在实现时要进行语法上的约束,编译器会将其声明为final。
枚举原理:
Java枚举的深入理解以及实现原理:
枚举本质上是通过普通的类来实现的,只是编译器为我们进行了处理。
每个枚举类型都继承自java.lang.Enum,并自动添加了values和valueOf方法。
而每个枚举常量是一个静态常量字段,使用内部类实现,该内部类继承了枚举类。
所有枚举常量都通过静态代码块来进行初始化,即在类加载期间就初始化。