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

时间:2011-11-22 21:29:21

标签: generics scala types alias

即我想为枚举编写自己的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()

不要太注意单身,它只是像Linq一样的包装(参见:Chart of IEnumerable LINQ equivalents in Scala?)。

问题在于E#Value。

问题

如何正确访问此别名,即如何访问泛型类型的别名? 将此枚举视为示例!

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

1 个答案:

答案 0 :(得分:5)

示例的问题是Enumerations被声明为对象。无法根据类名查找对象实例,因此稍作修改即可解决此问题。另外,对于泛型,find方法已经偏离了Enumeration中声明的抽象Value类型,因此我们需要添加一个instanceOf来修复输入。至于  通用别名,E#值是正确的。这提供了良好的打字。

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