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

r0e*_*bbe 3 scope scala

我正在编写一个扩展的类,Scanners迫使我定义类型Token:

object MyScanner extends Scanners {
  type Token = ...
}
Run Code Online (Sandbox Code Playgroud)

问题是我的令牌类本身被调用Token:

abstract class Token(...)
case class Literal(...)
...
Run Code Online (Sandbox Code Playgroud)

它是在斯卡拉在某种程度上可以定义类型TokenScanners,以我的Token课吗?

type Token = Token 显然不起作用.

我也尝试使用整个包名(以...开头main.scala),如下所示:

type Token = main.scala....Token
Run Code Online (Sandbox Code Playgroud)

这是另一个名称冲突,因为我在main里面定义了一个函数MyScanner.

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

mpi*_*ist 6

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

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 = ???
}
Run Code Online (Sandbox Code Playgroud)

其他一些选择包括:

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