【问题标题】:Scala Refer to a type parameterScala 引用一个类型参数
【发布时间】:2014-03-31 15:01:19
【问题描述】:

有没有办法引用类型参数?

例如,我想创建一个获取枚举子类的类,而不是使用他: 我想要的例子:

class MyEnum1 extends Enumeration{
    type MyEnum=Value
    a1=Value("A1")
    b1=Value("B1")
}

class MyEnum2 extends Enumeration{
    type MyEnum=Value
    a2=Value("A2")
    b2=Value("B2")
}


class UseType[T:<Enumeration]{
    val values=T.values
}

你知道我该怎么做吗?

【问题讨论】:

  • 你不会把实例(及其数据)和类(蓝图)单独放在一起吗?

标签: scala


【解决方案1】:

我认为您需要在对象级别而不是类型级别工作,并将一个实例(可以是单例对象)传递给您的类:

object MyEnum1 extends Enumeration {
  type MyEnum1 = Value
  val a1 = Value("A1")
  val b1 = Value("B1")
}

object MyEnum2 extends Enumeration {
  type MyEnum2 = Value
  val a2 = Value("A2")
  val b2 = Value("B2")
}

class UseType[T <: Enumeration](val t: T) {
  println(t.values)
}

new UseType(MyEnum1)              //> MyEnum1.ValueSet(A1, B1)
new UseType(MyEnum2)              //> MyEnum2.ValueSet(A2, B2)

不过,我不太确定您为什么要这样做 - 您能解释一下您要达到的目标吗?您可能需要为 MyEnum1MyEnum2 提供额外的共享特征,以便它们在您的代码中互换工作?

另请参阅 this questionthis one 以及 this one - 根据您的用例,您可能更喜欢使用密封案例类。

【讨论】:

  • 为什么你写 [T <: enumeration>val t: T) 当我试图在没有 val 的情况下编写它时它没有编译。有什么想法吗?
  • 我不知道为什么我添加了val! - 仅当您想将 t 引用为 UseType 的属性时才需要它,例如UseType(MyEnum1).t
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多