1

有什么方法可以强制执行返回某些内容的方法(以正则表达式表示):

(T with A) (T with A with B)+ (T with B)

如果我返回Traversable[T],它会丢弃绑定的特征。同样,我不能 return Traversable[T with A with B],因为这对于第一个和最后一个元素是不准确的。

我不知道如何解决这个问题。它在我的程序中引入了一些隐式条件,我觉得我正在通过使用.asInstanceOf[]强制转换来滥用类型系统。也许我使用了错误的数据结构?

这是我正在编写的代码示例,作为我的意思的示例。我正在寻求执行该route方法。该类User扩展了 type T,我省略了代码,因为有很多。

trait Producer extends User {
  def send(file: Data)
}

trait Consumer extends User {
  def receive(file: Data)
}

...

def route(sender: T with Producer, receiver: T with Consumer): Traversable[T]

def transfer(sender: T with Producer, receiver: T with Consumer, file: Data) {
  val path = route(sender, receiver)
  if (!path.isEmpty) {
    sender send file

    val nextHop = route(sender, receiver).tail.head

    nextHop.asInstanceOf[T with Consumer] receive file

    if (nextHop != receiver) {
      transfer(nextHop.asInstanceOf[T with Producer], receiver, file)
    }
  }
}
4

1 回答 1

3

你绝对应该避免使用.asInstanceOf[].

Scala 可以使用元组轻松地从一个方法返回多个值,那么为什么不返回一个 3 元组类型(T with A, Traversable[T with A with B], T with B)呢?

这是一个例子:

trait A
trait B
class T

def f(): (T with A, Traversable[T with A with B], T with B) = {
  (new T with A, List(new T with A with B), new T with B)
}

val (a, abs, b) = f()
于 2012-04-20T20:23:58.803 回答