4

私は DotNet から Java に移行していますが、この拡張の考え方は新しいものです。

List<? extends SomeAbstract>using vs. List<? super SomeAbstract>vs.を完全に説明する投稿を見たList<SomeAbstract>ことがありますが、ジェネリックでは extends を使用する場合と使用しない場合に違いはないと思います。

本当?抽象クラスを親として使用すると、答えは変わりますか?

class My_AbstractExtends<T extends SomeAbstract>

対。

class My_Abstract<SomeAbstract>

編集

次のように子クラスを作成します

class My_ChildExtends extends My_AbstractExtends<ConcreteChildOfSomeAbstract>

対。

class My_Child extends My_Abstract<ConcreteChildOfSomeAbstract>
4

3 に答える 3

8

型パラメーター宣言での extends の使用について話していると思います。その場合:

class My_Abstract<T extends SomeAbstract>

またはそのサブタイプでTある必要があるという境界付きの型パラメーターがあります。SomeAbstract

class My_Abstract<SomeAbstract>

と呼ばれる無制限の型パラメーターがあり、何でもかまいSomeAbstractません。最初の例が使用するSomeAbstract実際の型をまったく参照していないことに注意してください。SomeAbstract

それを拡張するには: 2 番目の宣言がclass My_Abstract<T>. 実際のT型ではなく、明らかに型パラメーターがあります。しかし、それを呼び出す必要はありません...またはまたはTと呼ぶことができます。これらのすべての場合において、それはまだ単なる型パラメーターです...実際の型は決してそこに行くことはできませんし、それが意味をなすこともありません(型パラメーターの全体的なポイントは、特定の型を参照しないことですが、代わりに、クラスのインスタンスが作成されるときに他の型をその場所に配置できるようにします)。EBobSomeAbstract

編集したコードで、My_Childの宣言を次のように変更します。

class My_Child extends My_Abstract<Object>

違いがわかります。2 番目のバージョンで型パラメーターを使用して実際に何かを実行しようとすると、実際のクラスSomeAbstractで宣言されたメソッドを呼び出すことができないこともわかります。SomeAbstractこれはすべて、1 文字の型パラメーターを使用するという慣例に従う必要がある理由の良い例です。そうしないと、本当に混乱します。

これは非常に長くなりますが、これはすべて基本的に質問の前半とは無関係であることにも注意してください. 型パラメーターの宣言 (ジェネリック クラスを定義するときに使用されるものなど) では使用されませんが、ワイルドカードは主にメソッド パラメーターに使用され? extends SomeAbstractます。は、オブジェクトのコンテナーとしての性質が比較的理解しやすいため、ワイルドカードが必要な理由を説明する典型的な例ですが、それらに関する規則はすべてのジェネリック型に適用されます。この回答では、これを比較的一般的な用語で説明しようとしました。? super SomeAbstractList

于 2011-06-15T16:38:16.523 に答える
2

T他の場所で参照できます。

public class A<T extends SomeClass>{
    public A(T x){this.x=x;}
    public T x;
}

その後、クラスのユーザーは、SomeClass を使用する代わりに、元の型を使用できます。

MyObject x = new A<MyObject>(new MyObject()).x;
于 2011-06-15T16:58:50.827 に答える
0

extendsジェネリック クラス宣言での使用:

  1. パラメータとして使用できる型を拡張クラスの子孫に制限します。
  2. ジェネリック クラスが、拡張クラスで宣言されたメソッドを呼び出せるようにします。

「?」キーワードは、手元のコードが型パラメーターの特定の型を気にせず、下限 (extends) または上限 (super) 境界のみを気にする場合にメソッドで使用されます。

ウィキペディアは、さまざまな構造の正味の効果を非常に実用的な方法で説明しています。

ジェネリックを指定するためにいくつかの異なる構造が必要な理由を理解するには、ジェネリックが存在する場合の静的な型の安全性に関する規則の理論上の名前であるcovariance と contravarianceについて読む必要があります。

于 2011-06-16T12:24:33.807 に答える