如何处理Scala中的类型名称冲突?

时间:2013-03-16 18:50:26

标签: scala scope

我正在编写一个从Scanners延伸的类,这迫使我定义类型Token

object MyScanner extends Scanners {
  type Token = ...
}

问题是我的令牌类本身被称为Token

abstract class Token(...)
case class Literal(...)
...

Scala能以某种方式为我的Token类定义Scanners的{​​{1}}类型吗?

Token显然不起作用。

我也试过使用整个包名(以type Token = Token开头),如下所示:

main.scala

这是另一个名称冲突,因为我在type Token = main.scala....Token 内定义了main函数。

我目前的解决方案是重命名我的令牌类。还有另一个我可以保留初始名称吗?

1 个答案:

答案 0 :(得分:6)

使用完全限定的类名定义令牌类型。要避免名称与main方法发生冲突,可以使用 root 前缀表示您引用的是完全限定的类型名称,而不是相对类型名称和方法名称。例如:

package main

import scala.util.parsing.combinator.lexical._

case class Token(s: String)

object MyScanner extends Scanners {
  type Token = _root_.main.Token
  val Token = _root_.main.Token
  def errorToken(msg: String) = Token(msg)
  def token = ???
  def whitespace = ???

  def main = ???
}

其他一些选择包括:

  1. 在MyScanner对象外部定义类型别名(在封闭对象或包对象中)。
  2. 导入您的令牌类并将其别名作为导入的一部分。例如:import main.scala.{Token => MyToken}