1

(正規表現表記で)の線に沿って何かを返すメソッドを強制できる方法はありますか?

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

戻るTraversable[T]と、バインドされた特性が削除されます。同様に、Traversable[T with A with B]これは最初と最後の要素に対して不正確になるため、返すことはできません。

これを回避する方法がわかりません。.asInstanceOf[]それは私のプログラムにいくつかの暗黙の条件を導入し、私はキャストを使用して型システムを悪用しているように感じます。たぶん私は間違った種類のデータ構造を使用していますか?

これが私が書いているコードのサンプルで、私が言っていることの例です。私はそのroute方法を強制しようとしています。Userクラスはタイプを拡張します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 に答える