我对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
如果我必须重新设计我的课程,那很好。请让我知道如何实现这一目标。
提前致谢
答案 0 :(得分:0)
我不确定代码中的ConfigProperties
是什么,以及为什么需要类型参数,但问题的答案是,将geProperty
中的参数类型声明为Value
- > getProperty(prop: Value)
。
Value
是Enumeration
中的嵌套抽象类,因此编译器将分别将其扩展为AB.Value
和XY.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)
//