私は現在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 は、型の反変の位置で発生します