我在这种风格中有不同类型的枚举
class Gender extends Enumeration {
type Gender = Value
val Male,Female = Value
}
我希望有一个给定枚举元素的泛型函数,它在长度为.maxId的数组中放置1(如果你熟悉R,我试图实现 factor < /强>)。但是我无法使这些类型正确,我的功能就像这个(错误的)代码:
def toFactor[T](elem:T.Value):List[Double] = {
var array = Array.fill(T.maxId)(0.0)
array(elem.id) == 1.0
array.toList
}
您如何编写此代码,因此对于我们使用的任何枚举都是通用的?
答案 0 :(得分:1)
此代码应该这样做:
object Gender extends Enumeration {
type Gender = Value
val Male, Female = Value
}
def toFactor[E <: Enumeration, V <: E#Value](enum: E, elem: V): List[Double] = {
var array = Array.fill(enum.maxId)(0.0)
array(elem.id) = 1.0
array.toList
}
println(toFactor(Gender, Gender.Female)) // prints: List(0.0, 1.0)
您需要使用E#Value
代替E.Value
,因为它通常会告知:所提供的Value
Enumeration
中的任何E
。 E <: Enumeration
将E
限制为Enumeration
的子类。您还需要枚举实例才能获得maxId
。
您还可以稍微简化toFactor
方法,避免使用任何Array
或id
s:
def toFactor[T <: Enumeration, V <: T#Value](enum: T, elem: V): List[Double] =
enum.values.toList map (curr => if (curr == elem) 1.0 else 0.0)