2

ウィキペディアは次のように定義しcovarianceています

より広い (動物) からより狭い (猫) に変換します。

しかし、 のような言語ではJava、戻り型の共分散は、サブタイプをスーパータイプに割り当てることとして定義されます。

public Animal getAnimal(){
   return new Cat();
}

ここでは、サブタイプをスーパータイプに割り当てていますが、Wikipedia定義によれば、共分散はスーパータイプをサブタイプに割り当てています。どうすれば2つを調整できますか?

4

4 に答える 4

2

共変の戻り値の型を持つことの意味を誤解しています。

メソッドをオーバーライドする場合にのみ関連し、return ステートメントで使用される型や呼び出し元がメソッドから期待するものを参照しません。共変の戻り値の型とは、サブタイプのメソッドをオーバーライドし、オーバーライド中に戻り値の型を変更できることを意味します (スーパータイプのメソッドよりも狭い戻り値の型を与えます)。

例:

public class SuperType {
  public Animal getAnimal() { ... }
}

public class SubType extends SuperType {
  public Cat getAnimal() { ... }
}

ここではウィキペディアの定義が一致します。

Java 言語仕様では、セクション 8.4.8.3でこれを確認しています(例 8.4.8.3-1を参照)。

メソッド パラメーターの場合、Java では反変型が必要であることに注意してください。ingetAnimal型のパラメーターを受け取った場合、クラスはこのパラメーターを に狭めることはできませんが、 (eg) に広げることはできます。AnimalSuperTypeSubTypeCatObject

于 2012-11-13T08:27:24.313 に答える
1

「共変」という一般的な用語は、軸に沿って変化する可能性のある 2 つのエンティティを意味し、一方がジグを作ると他方もジグを作るように、エンティティが関連していること示します。対照的に、「反分散」とは、一方がzigを作成すると、もう一方がzagを作成することを意味します。

具体的には、型理論では、一方を絞り込むと他方も絞り込まれる場合、2 つの型は共変です。

これを Java の戻り値の型に適用すると、クラスからそのサブクラスにステップするとき、メソッドの戻り値の型はクラスからサブクラスに同じようにステップできます。

これを、メソッド パラメーターにとって意味のあるものと比較してください。クラスからサブクラスにステップすると、パラメーターの型はクラスからスーパークラスにステップする可能性があります。この機能は Java には存在しませんが、存在する場合は、このように動作します。

于 2012-11-13T09:03:01.580 に答える
0

あなたが述べたウィキペディアの共分散の定義は、Java関数が行っていることと同じです。この関数は動物を返しますが、この場合は猫に絞り込みます (したがって、より多くのバリエーションがあります)。

おそらく、「ウィキペディアの定義によると、共分散はスーパータイプをサブタイプに割り当てることです」と間違っています。これは幅の広い (動物) から幅の狭い (猫) への変換と同じではなく、正反対です。

//This is covariance, as you go from wider, to narrower
Animal someAnimal = new Animal();
someAnimal = getAnimal(); //now someAnimal is a cat, as by your code example.
于 2012-11-13T08:09:27.053 に答える
0

次の方法で表示してみてください。

このメソッドは、「動物をあげます」と言っていますが、後で猫を与えた場合、それは嘘ではありません。幅広タイプから幅狭タイプまであります。

于 2012-11-13T08:36:29.393 に答える