型パラメーター宣言での extends の使用について話していると思います。その場合:
class My_Abstract<T extends SomeAbstract>
またはそのサブタイプでT
ある必要があるという境界付きの型パラメーターがあります。SomeAbstract
class My_Abstract<SomeAbstract>
と呼ばれる無制限の型パラメーターがあり、何でもかまいSomeAbstract
ません。最初の例が使用するSomeAbstract
実際の型をまったく参照していないことに注意してください。SomeAbstract
それを拡張するには: 2 番目の宣言がclass My_Abstract<T>
. 実際のT
型ではなく、明らかに型パラメーターがあります。しかし、それを呼び出す必要はありません...またはまたはT
と呼ぶことができます。これらのすべての場合において、それはまだ単なる型パラメーターです...実際の型は決してそこに行くことはできませんし、それが意味をなすこともありません(型パラメーターの全体的なポイントは、特定の型を参照しないことですが、代わりに、クラスのインスタンスが作成されるときに他の型をその場所に配置できるようにします)。E
Bob
SomeAbstract
編集したコードで、My_Child
の宣言を次のように変更します。
class My_Child extends My_Abstract<Object>
違いがわかります。2 番目のバージョンで型パラメーターを使用して実際に何かを実行しようとすると、実際のクラスSomeAbstract
で宣言されたメソッドを呼び出すことができないこともわかります。SomeAbstract
これはすべて、1 文字の型パラメーターを使用するという慣例に従う必要がある理由の良い例です。そうしないと、本当に混乱します。
これは非常に長くなりますが、これはすべて基本的に質問の前半とは無関係であることにも注意してください. 型パラメーターの宣言 (ジェネリック クラスを定義するときに使用されるものなど) では使用されませんが、ワイルドカードは主にメソッド パラメーターに使用され? extends SomeAbstract
ます。は、オブジェクトのコンテナーとしての性質が比較的理解しやすいため、ワイルドカードが必要な理由を説明する典型的な例ですが、それらに関する規則はすべてのジェネリック型に適用されます。この回答では、これを比較的一般的な用語で説明しようとしました。? super SomeAbstract
List