scala使用模板类型来解析子类

时间:2017-07-13 20:06:59

标签: scala

我对Scala很新,并尝试重用代码。我有两个枚举AB和AC,都扩展了A,这是一个具有一些常用方法的特征。

object AB extends A[AB]{ 
  val X = Value("x")
}

object AC extends A[AC]{ 
  val Y = Value("y")
}

trait A[T] extends Enumeration{
def getProperty(prop: T.Value): String = {
  //some code that uses prop.toString
}

我正在尝试使用一个getProperty方法,该方法将用户限制为仅调用它的枚举中的枚举。

如果我调用AB.getProperty(),那么我应该只能传递X.如果我调用AC.getProperty而不是我应该只能传递Y

如果我必须重新设计我的课程,那很好。请让我知道如何实现这一目标。

提前致谢

1 个答案:

答案 0 :(得分:0)

我不确定代码中的ConfigProperties是什么,以及为什么需要类型参数,但问题的答案是,将geProperty中的参数类型声明为Value - > getProperty(prop: Value)

ValueEnumeration中的嵌套抽象类,因此编译器将分别将其扩展为AB.ValueXY.Value,具体取决于实例。您可以在REPL中测试的简化示例:

object AB extends A {
    val A = Value('A')
    val B = Value('B')
}

object XY extends A {
    val X = Value('X')
    val Y = Value('Y')
}


trait A extends Enumeration {
    def getProperty(prop: Value): String = {
        //some code that uses prop.toString
        prop.toString()
    }
}


AB.getProperty(AB.A) // OK
XY.getProperty(XY.Y) // Also OK

// AB.getProperty(XY.X) <- this won't compile
//                         Error:(21, 20) type mismatch;
//                         found   : A$A238.this.XY.Value
//                         required: A$A238.this.AB.Value
//                         AB.getProperty(XY.X)
//