3

私は、インターフェイスComparableを実装するタイプTの3つのパラメーターを受け取るこのメソッドを使用しました

public static < T extends Comparable< T > > T maximum( T x, T y, T z ) {}

私はこれを次のような他の方法で宣言することについて質問しています(パラメーターとしてComparableオブジェクトを使用すると仮定します)

public static <Comparable <T>> T maximum (T x, T y, T z){}

別の質問ですが、最初の宣言では、Comparableがインターフェイスであることを知っているので、なぜそれが??の<T extends Comparable<T>>代わりに記述されているのですか?<T implements Comparable<T>>

4

3 に答える 3

4

public static <Comparable <T>> T maximum (T x, T y, T z){}パラメーター T がメソッドに対して宣言されていないため、コンパイルされていません。

Comparable がインターフェースであることは知っていますが、なぜ > ではなく > と書かれているのでしょうか??

インターフェイスを実装するためにパラメーターが必要な場合でも、バインドされた型パラメーターの構文はありextendsません。implements

于 2013-03-22T11:27:54.313 に答える
3

どちらの質問にも次のように答えることができます: 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 つの異なる意味があります。

  1. クラス宣言で使用して、別のクラスを継承できます
  2. 型パラメーターに上限を設定するために使用できます

Java の作成者は、2 つのケースを区別するために別のキーワードを使用することもできましたが、既存のキーワードの方が開発者にとって覚えやすいと感じたため、単純に既存のキーワードをオーバーロードしました。しかし、それらは間違いなく異なるキーワードです。そのため、型パラメーターの上限を宣言するときに実装を使用しないのです。

于 2013-03-22T11:34:24.033 に答える
0

のJavadocを見てくださいCollections.sort。署名は次のとおりです。

public static <T extends Comparable<? super T>> void sort(List<T> list)

私が持っている場合はそうです

class A implements Comparable<A> {...}
class B extends A {...}
// ...
List<B> bs = ...
Collections.sort(bs);

B はクラス A のコンパレータを介して比較できるため、リストを並べ替えることができます。したがって、次のように記述します。

public static < T extends Comparable< ? super T > > T maximum( T x, T y, T z ) {}
于 2013-03-22T11:32:50.187 に答える