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

标签 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()

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

问题出在 E#Value。

问题

如何正确访问此别名,即如何访问通用类型的类型别名? 以这个枚举为例!

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

最佳答案

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

关于generics - 如何在 Scala 中访问泛型类型的类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234065/

相关文章:

class - 方法未定义(类型没有方法)

python - 如何向 Python 模块提供元素周期表信息

Java:结合泛型、内部类和 "implements"的问题

c++ - 理解这个 Scala 代码

c# - 如何将此 EF Mock 设置代码编写为可重用的通用样板?

scala - Akka 远程处理和 Heroku

scala - 仿函数有什么用处?

typescript - IDE 找不到声明的全局类型

generics - 如何消除特征对象边界中的关联类型的歧义?

c# - 为什么 Nullable<T> 不匹配作为泛型约束的引用类型