如何在Scala中访问泛型类型的别名?

gre*_*man 3 generics alias types scala

即我想为枚举编写自己的valueOf,因为现在Scala设计者已经删除了这个方法(奇怪的调用 - https://issues.scala-lang.org/browse/SI-4571).

def valueOf[E <: Enumeration](s : String) =
           E#Value.values.filter(it => it.toString==s).single()
Run Code Online (Sandbox Code Playgroud)

不要太注意单一,它只是像Linq一样的包装器(参见:Scala中IEnumerable LINQ等价物的图表?).

问题在于E#Value.

如何正确访问此别名,即如何访问泛型类型的别名?把这个Enum作为例子!

有withName方法,即使它被认为是替换它被设计破坏,值也不是名称,所以我不会用它来避免进一步混淆代码正在做什么.

Nei*_*ssy 5

该示例的问题是Enumerations被声明为对象.无法根据类名查找对象实例,因此稍作修改即可解决此问题.另外,做仿制药find方法已经离题在枚举声明的抽象值类型,所以我们需要添加一个instanceof来解决打字.至于通用别名,E#Value是正确的.这提供了良好的打字.

def valueOf[E <: Enumeration](enum: E, s : String): E#Value = 
  enum.values.find( { it => it.toString == s } ).get.asInstanceOf[E#Value]

object WeekDay extends Enumeration {
  val  Sun, Mon, Tue, Wed, Thu, Fri, Sat = Value
}
object Currency extends Enumeration {
  val USD, GBP, EUR = Value
}

val mySun: WeekDay.Value = valueOf(WeekDay,"Sun")
val myCur: Currency.Value = valueOf(WeekDay,"Sun") // fails to compile
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你.它慢慢陷入"对象实例无法根据类名查找":-)它(IOW)是否意味着调用E#Value的任何方法都是非法的,因为它是类,我需要对象得到我实际定义为我的anum(例如WeekDay)? (2认同)