3

私は現在scalaを学んでおり、分散注釈、特に共分散分散について混乱しています。

だから私はいくつかの研究を行い、次の例に出くわしました

 class Box[+T] {

    def put[U >: T](x: U): List[U] = {
      List(x)
    }

  }

  class Animal {

  }

  class Cat extends Animal {

  }

  class Dog extends Animal {

  }

  var sb: Box[Animal] = new Box[Cat];

これは、クラス Box が T で共変であることを意味します。これは、Cat が Animal のサブクラスであるため、Box[Cat] が Box[Animal] のサブクラスであることを意味します。私はこれを理解しています。しかし、メソッドのパラメーターに関しては、私の理解は終わりです。仕様によると、メソッドのパラメーターは共変にできないため、この下限の注釈を使用する必要があります。

メソッド定義を見てみましょう

 def put[U >: T](x: U): List[U] = {
   List(x)
 }

したがって [U >: T] は、U が T のスーパークラスでなければならないことを示しています。

次のコードを試す

  var sb: Box[Animal] = new Box[Cat];
  sb.put(new Cat);

期待どおりに動作しますが、これは私を夢中にさせます

  var sb: Box[Animal] = new Box[Cat];
  sb.put(1);

INTはAnimalのスーパークラスであるAnyに解決されるため、 INTを Box of Animalsに入れることは論理的に意味がありません。

だから私の質問は

put method動物のサブタイプのみを受け入れるコードをどのように適応させる必要がありますか? 上限アノテーションが使えない

class Box[+T] {

    def put[U <: T](x: U): List[U] = {
      List(x)
    }

  }

このよく知られたエラーが発生するので

共変の型 T は、型の反変の位置で発生します

4

1 に答える 1