1

いくつかのオブジェクトのインデックス付きシーケンスで動作するアルゴリズムがあります。このようなシーケンスを 2 つ取得し、結果のシーケンスを 1 つ出力する必要があります。少なくとも次のように動作できるようにしたいと思います。

  • 文字列内の文字
  • テキストの配列内の行 (文字列)

簡単にするために、このアルゴリズムがオブジェクトの新しいシーケンスを構築し、元のシーケンスのそれぞれからオブジェクトを 1 つずつ取得すると仮定しましょう。目的のタイプのオブジェクトの空のシーケンスまたは元のオブジェクトのいずれかを返さなければならない特殊なケースがいくつかあります。元のシーケンスで使用する操作は次の 2 つだけです。

  • インデックスによるi番目の要素の取得
  • シーケンスのサイズを取得する

私の現在のコードは次のようになります。

class GenericTest[C, T <: IndexedSeq[C]](a: T, b: T) {
  def run: T = {
    // special case #1: need to return empty sequence here
    if (a.size == 0) {
      // what I've tried:

      return new T()
      // fails: "class type required but T found"

      return Seq[C]()
      // fails: "type mismatch; found : Seq[C] required: T"

      return Array[C]()
      // fails: "not enough arguments for method apply: (implicit
      // evidence$2: scala.reflect.ClassTag[C])Array[C] in object
      // Array. Unspecified value parameter evidence$2."

      return Array.ofDim[C](0)
      // fails: "No ClassTag available for C"
      // "not enough arguments for method ofDim: (implicit
      // evidence$3: scala.reflect.ClassTag[C])Array[C].
      // Unspecified value parameter evidence$3."
    }

    // special case #2: need to return original input here
    if (a == b) {
      return a
      // it works
    }

    val result = new MutableList[C]

    for (i <- 0 until scala.math.min(a.size, b.size)) {
      result += a(i)
      result += b(i)
    }

    // what I've tried:

    return result
    // fails: "type mismatch; found : result.type (with underlying
    // type scala.collection.mutable.MutableList[C]) required: T"

    return result.toIndexedSeq
    // fails: "type mismatch; found : scala.collection.immutable.IndexedSeq[C]
    // required: T"
  }
}

したがって、基本的に、問題は、このタスクができるように Scala ジェネリックを適切に設定するにはどうすればよいかということです。

  • オブジェクトの空のシーケンスを返す
  • 構築されたオブジェクトのシーケンスを返す
  • 元の入力を返す

この質問には、型の共分散/反分散アノテーションが必要だと思います。私の共分散フーには欠けているようです...

4

1 に答える 1