どちらの質問にも次のように答えることができます: this is the Java syntax. Java 言語では、パラメータ化されたメソッドは次のように宣言されます。
[optional modifiers] <T> [return type] foo() {}
という名前の型パラメーターを宣言します。これは、構文の上限で制約できます。T
T extends [type expression]
メソッドの残りの部分 (戻り値の型、仮パラメーター リスト、メソッド本体) では、メソッドT
を呼び出すときに渡す型を参照します。次のような宣言で:
Comparable<T>
T
は型パラメーターではありませんが、パラメーター化された型をインスタンス化するために使用される型引数Comparable<E>
であり、次のようなより大きなスコープに属しています。
class Foo<T> {
public Comparable<T> foo(T arg1, T arg2) {}
}
ソース ファイル内のテキスト<Comparable<T>>
(山かっこで囲まれたタイプ) はまったく許可されていないことに注意してください。ファイルのコンパイルを拒否するコンパイラにとっては何の意味もありません。
同様に、2 番目の質問に関してextends
は、単に Java 言語のキーワードであり、2 つの異なる意味があります。
- クラス宣言で使用して、別のクラスを継承できます
- 型パラメーターに上限を設定するために使用できます
Java の作成者は、2 つのケースを区別するために別のキーワードを使用することもできましたが、既存のキーワードの方が開発者にとって覚えやすいと感じたため、単純に既存のキーワードをオーバーロードしました。しかし、それらは間違いなく異なるキーワードです。そのため、型パラメーターの上限を宣言するときに実装を使用しないのです。