次のようにバインドされたジェネリックパラメータをコーディングすることができます。
public <T super Object> void someMethod(T t);
そのような境界の有効な使用法はありますか?
JLS http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4によると、タイプパラメータ(<T extends Object>用語)は次のもので構成されます。
TypeParameter:
TypeVariable TypeBound*
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType AdditionalBoundList*
AdditionalBoundList:
AdditionalBound AdditionalBoundList
AdditionalBound
AdditionalBound:
& InterfaceType
*=オプション
が表示されTypeBound
ますが、指定された使用法のみがありextends
ます。残念ながら、を使用した下限型パラメーターsuper
は指定されていません。下限はワイルドカードの使用法でのみ指定されます(JLS#4.5.1)
良い質問です。JLSを掘り下げました。なぜこれがJavaに実装されていないのかわかりませんが、指定されていないだけです。
そのようなより低い結合は全く役に立たない。オブジェクトのみを受け入れることができるテンプレートが必要な場合は、すべての汎用テンプレートを削除し、オブジェクトをタイプとして使用してクラスを直接コーディングするだけです。
Object以外のタイプの場合、どちらも意味がありません。タイプAのオブジェクトまたはタイプAのないオブジェクト(たとえばオブジェクト)を受け入れるが、BがAのサブクラスである場合にタイプBのオブジェクトを拒否するテンプレートが必要なのはなぜですか?それは完全に非論理的です。
インターフェイスについても同じ考えです。インターフェイスIをまったく実装していないタイプ、またはインターフェイスIを実装しているタイプはすべて受け入れますが、インターフェイスIだけでなく拡張したタイプも拒否します。