3

次のようにバインドされたジェネリックパラメータをコーディングすることができます。

public <T super Object> void someMethod(T t);

そのような境界の有効な使用法はありますか?

4

2 に答える 2

2

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に実装されていないのかわかりませんが、指定されていないだけです。

于 2013-01-01T01:42:10.540 に答える
1

そのようなより低い結合は全く役に立たない。オブジェクトのみを受け入れることができるテンプレートが必要な場合は、すべての汎用テンプレートを削除し、オブジェクトをタイプとして使用してクラスを直接コーディングするだけです。

Object以外のタイプの場合、どちらも意味がありません。タイプAのオブジェクトまたはタイプAのないオブジェクト(たとえばオブジェクト)を受け入れるが、BがAのサブクラスである場合にタイプBのオブジェクトを拒否するテンプレートが必要なのはなぜですか?それは完全に非論理的です。

インターフェイスについても同じ考えです。インターフェイスIをまったく実装していないタイプ、またはインターフェイスIを実装しているタイプはすべて受け入れますが、インターフェイスIだけでなく拡張したタイプも拒否します。

于 2013-01-01T04:04:53.760 に答える