一个Scala泛型函数可以接受给定T的任何T.Value扩展Enumeration?

时间:2017-03-20 20:37:50

标签: scala generics enums

我正在尝试创建一些函数,它们使用整个Enumeration和从Enumeration中选择的单个值作为参数。

很容易创建一个接受任何类型的Enumeration对象作为参数的泛型函数,但是如何创建一个接受Enumeration中任何单个值的泛型函数作为它的参数?

object Xenu extends Enumeration {
  type Xenu = Value
  val foo, bar, baz = Value
}

object Yenu extends Enumeration {
  type Yenu = Value
  val blip, blop, blap, blep = Value
}


def doStuff[E <: Enumeration](e:E):Int = {
  // Works fine
  println("Got an enum: " + e.toString())
  e.values.size
}

def funnyBusiness[E <: Enumeration](v: E.Value): Unit = {
  // This doesn't work!
  println(v)
}

doStuff(Xenu) // Works
doStuff(Yenu) // Works

funnyBusiness(Xenu.bar) // Wrong
funnyBusiness(Yenu.blip) // Wrong

你能帮我写一个“funnyBusiness”的泛型函数声明,这样我可以接受任何Enumeration中的任何一个值吗?

2 个答案:

答案 0 :(得分:2)

你可以用这样的签名获得很多东西,但是你去了:

funnyBusiness中的问题是您对.类型使用E表示法,该表示法不存在。要使用类型相关类型,请使用#表示法,例如E#Value

除此之外,你的功能很好:

def funnyBusiness[E <: Enumeration](v: E#Value): Unit = {
  println(v)
}

答案 1 :(得分:0)

解决方案非常简单:

def funnyBusiness[E <: Enumeration](v: E#Value): Unit = {
  // This doesn't work!
  println(v)
}