3

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

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

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

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

是否可以在 Scala 中以某种方式定义我的类Token的类型?ScannersToken

type Token = Token显然行不通。

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

type Token = main.scala....Token

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

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

4

1 回答 1

6

使用完全限定的类名定义 Token 类型是可行的。为避免名称与您的 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 = ???
}

其他一些替代方案包括:

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