【问题标题】:How to access type alias of generic type in Scala?如何在Scala中访问泛型类型的类型别名?
【发布时间】:2012-01-04 06:22:19
【问题描述】:

也就是说,我想为枚举编写自己的 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()

不要太注意single,它只是类似Linq的包装器(见:Chart of IEnumerable LINQ equivalents in Scala?)。

问题在于 E#Value。

问题

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

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

【问题讨论】:

    标签: generics scala types alias


    【解决方案1】:

    这个例子的问题是枚举被声明为对象。无法根据类名查找对象实例,因此稍作更改即可解决此问题。此外,对于泛型,find 方法已经偏离了在 Enumeration 中声明的抽象 Value 类型,因此我们需要添加一个 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
    

    【讨论】:

    • 非常感谢。慢慢地它陷入“无法根据类名查找对象实例”:-) 它(IOW)是否意味着调用 E#Value 的任何方法都是非法的,因为它是类,我需要对象得到我实际定义为我的年数(例如 WeekDay)?
    猜你喜欢
    • 2021-04-09
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多