5 に答える
定義は、それがを拡張または実装するタイプであること<S extends CharSequence>
を意味します。S
CharSequence
S
その前後の存在に注意してくださいfoo
。これは、をfoo
拡張または実装する型を返しCharSequence
、同じ型の引数を受け入れることを意味します。
つまり、メソッドfooはCharSequence(またはそのサブクラスまたは実装クラス)をパラメーターとして受け取り、戻り値と同じ型を返します。
たとえば、次のようなメソッドを呼び出すことができます
CharSequence s = ...
CharSequence result = foo(s);
また
String s = ...
String result = foo(s);
また
StringBuffer s = ...
StringBuffer result = foo(s);
ただし、不一致の戻り値とパラメーターのタイプを使用することはできません。これらは大丈夫ではありません:
String s = ...
StringBuffer result = foo(s);
また
StringBuffer s = ...
String result = foo(s);
次の行は次のとおりです。メソッドfoo
は、パラメータとしてタイプのオブジェクトを受け取り、extendsS
を指定すると、タイプSのオブジェクトを返します。たとえば、StringBuilder(CharSequenceを拡張)をこのコンテキストに置くと、次のようになります。S
CharSequence
public StringBuilder foo (StringBuilder s)
<S extends CharSequence>
リターンタイプの一部ではありません。ジェネリックメソッドに型パラメーターを導入しますfoo
。ここでS
は、で囲まれた型パラメータ(上)として紹介されていますCharSequence
。foo
タイプのパラメータを取りS
、同じものを返します。
S foo(S s)
は、foo
メソッドが 型のパラメーターを取り、 S
を返すことを意味しますS
。
また、メソッドfoo
は、それを使用できるタイプを定義しています: S
(テンプレート化された結果) は のサブクラスですCharSequence
。
たとえば、次のように呼び出すことができます。
foo("example")
そして、それは文字列を返します(String
は のサブクラスであるため有効ですCharSequence
。
そして、この特定の実装は、すべての場合に null を返します。