Scala枚举变量类型及MyEnums.scala相关6个技术疑问
先看你提供的枚举代码:
object AllEnums extends Enumeration { type Enums = Value val one,two,three = Value def getAllValues() : String = values.mkString(",") }
疑问解答:
AllEnums是否是MyEnums.scala类的对象?
不是。AllEnums是Scala的单例对象(Singleton Object),它定义在MyEnums.scala源文件中,但并非某个类的实例——Scala单例对象本身是独立的实体,它直接继承自标准库的Enumeration类,没有对应的同名类(除非你额外定义class AllEnums,但这里并没有)。如果第1点成立,是否意味着MyEnums.scala继承自身?
这个前提不成立,也不存在继承自身的情况。AllEnums继承的是Scala标准库的Enumeration类,源文件名MyEnums.scala只是代码的组织载体,和类/对象的继承逻辑完全无关。type Enums = Value语句中,Value是Scala的类型,该语句的实际意义是什么?
这是Scala的类型别名语法。Value是Enumeration类内部定义的嵌套类型,代表枚举项的类型。type Enums = Value就是给Value起了一个更直观的别名,后续你可以用AllEnums.Enums来指代该枚举的项类型,比直接写AllEnums.Value更符合枚举的命名习惯。val one,two,three = Value中,= Value是否表示这些val被赋值为Value类型的实例?
是的。这里的Value实际是调用Enumeration类的无参Value()方法,每次调用都会生成一个Value类型的实例,作为枚举项。所以one、two、three分别是三个独立的Value实例,对应三个枚举值。val one,two,three是否是MyEnums.scala类的实例变量,而该类本质是Enumeration类型?
首先不存在MyEnums.scala这个类——MyEnums.scala是源文件名。这些val是单例对象AllEnums的成员变量,而AllEnums是Enumeration的子类实例(因为它extends Enumeration)。准确来说:one、two、three是AllEnums单例对象的成员,AllEnums本身属于Enumeration类型。这些val(one、two、three)的类型是什么?赋值为Value类型,但变量本身是否有特定类型?
它们的类型是AllEnums.Value(或者你定义的别名AllEnums.Enums)。Value是Enumeration的嵌套类型,每个枚举单例对象的Value都是该单例专属的嵌套类型(相当于每个枚举都有自己的Value子类型),所以one的类型不是通用的Enumeration#Value,而是属于AllEnums这个枚举的特定Value类型。
内容的提问来源于stack exchange,提问作者Julie

