キーワードと演算子 (およびその他のもの) の列挙型があります。たとえば (すべて類似しています):
object Keywords extends Enumeration {
val AND, ARRAY, BEGIN, ...= Value
case class Keyword(keyword: Value) extends Token[Value] {
def this(keyword: String) = this(Keywords.fromString(keyword))
def value = keyword
}
implicit def valueToKeyword(keyword: Value) = new Keyword(keyword)
}
Token
この暗黙的な変換により、 s が期待される場所に列挙値を渡すことができます。
def testFunction[T](t: Token[T]) = ...
testFunction(Keywords.ARRAY) // gets converted
testFunction(Operators.PLUS) // gets converted too
また、マッチング中に同じ暗黙的な変換が適用されないようです。
val token = new Keyword("ARRAY")
token match {
case Keywords.ARRAY => ... // not selected but SHOULD be
case Operators.PLUS => ... // completely different Enum
...
}
なんで?これを克服する方法は?