1

:::からのメソッド(これは演算子メソッドですか?)を使用しようとしていますList。REPLに2つのリストを入力し、何が起こっているかを確認した後、現在何が行われているのかがわかりました。ただし、:::メソッドのAPI定義は、読みにくく、理解しにくいものでした。私はそれが「返す」ものを読むことによってのみ「それを手に入れました」。

def :::[B >: A](prefix: List[B]): List[B]
    Adds the elements of a given list in front of this list.
    prefix  The list elements to prepend.
    returns list resulting from the concatenation of the given list prefix and this list.
    Example:  List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4)

特に、この部分の意味は次のとおり[B >: A](prefix: List[B])です。つまり、メソッドが何を返すかを読んでそれを試してみると、メソッドが何を返すかを理解できたということです。将来的には、別のメソッドのAPIを読んで、すべてを理解できるようにしたいと思います。それが私がこの質問をしている理由です。

4

3 に答える 3

4

[B >: A]Bこれは、メソッドが汎用であり、のスーパータイプでなければならないという1つの型引数を取ることを意味しAます。型(prefix : List[B])と呼ばれる実際の引数が1つかかることを意味します。prefixList[B]

于 2012-10-15T21:53:55.513 に答える
2

サブタイプがなかった場合、これは次のように記述されdef :::(prefix: List[A]): List[A]ます[B >: A]。たとえば、の前にaList[Animal]を付けてList[Cat]、を大きくすることができますList[Animal]

于 2012-10-15T22:21:36.557 に答える
1

2つの答えは両方とも正しいです。Aこれは現在のリストBの型パラメーターであり、提供先のリストの型パラメーターであることを覚えておく必要があります。:::

まだ自信がない場合は、独自のリストの定義を試すことができます

  class MyList[+A]{
    def :::[B >: A](prefix: MyList[B]): MyList[B] = new MyList[B]()
  }

  class Animal
  class Dog extends Animal
  class Pig extends Animal
  class Rock 

そして今、あなたはREPLでテストすることができます:

scala>  new MyList[Dog]
res0: Test.AkkaTest.MyList[Test.AkkaTest.Dog] = Test.AkkaTest$MyList@190a0d51

scala>  new MyList[Pig]
res1: Test.AkkaTest.MyList[Test.AkkaTest.Pig] = Test.AkkaTest$MyList@1db5d2b2

scala>  res0:::res1
res2: Test.AkkaTest.MyList[Test.AkkaTest.Animal] = Test.AkkaTest$MyList@25927275

scala>  new MyList[Rock]
res3: Test.AkkaTest.MyList[Test.AkkaTest.Rock] = Test.AkkaTest$MyList@49f85a86

scala>  res3:::res0
res4: Test.AkkaTest.MyList[ScalaObject] = Test.AkkaTest$MyList@42130c2

scala>  res0:::res3
res5: Test.AkkaTest.MyList[ScalaObject] = Test.AkkaTest$MyList@6f24d504

したがって、:::は2つのリストを連結し、ジェネリック型が最初の共通の祖先であるリストを作成することを理解しておく必要があります。これは、型リストが共変であるためです。たとえば、res3とres0の場合、コンパイラーは次のことを行うと考えるかもしれません。

  • AはRockBはDog、BはAの親クラスではない、多分コンパイラエラーをスローする必要がありますか?
  • ただし、MyListは共変であるため、MyList[Dog]はMyList[ScalaObject]のサブクラスです。
  • かっこいい、ScalaObjectはRockの親クラスなので、ScalaObjectのリストを作成します
于 2012-10-16T09:51:01.960 に答える