1

Javaの宿題のいくつかに問題があります。これらのジェネリックの概念を理解することはできません。

質問は:

以下がクラスのメソッドヘッダーであると想定します。

public <T implements Comparable <T>>T greatest(T arg1, T arg2)

エラーを見つけますか?

どうすればいいのかよくわかりません。

4

4 に答える 4

2

そのようなものをコンパイルするには、次の方法で変更する必要があります。

public <T extends Comparable <T>> T greatest(T arg1, T arg2)

Comparableはインターフェースですが、このコンテキストでは、extendsは「extends」(クラスの場合)または「implements」(インターフェースの場合)のいずれかを意味するために使用されます。

于 2012-09-28T12:53:27.527 に答える
1

エラーは、メソッド シグネチャでキーワード implements を使用できないことです。クラス宣言のみ。これらは両方ともコンパイルします:

 public <T extends Comparable<T>>T greatest(T arg1, T arg2){
     return null;
    }

 public <T extends String>T greatest(T arg1, T arg2){
     return null;
    }
于 2012-09-28T13:02:00.127 に答える
1

どうすればいいのか本当にわからないので、これについての説明が必要です。

署名の意味を説明してほしいと仮定すると...

これは、次の 2 つの部分に分けることができます。

public <T ...> T greatest(T arg1, T arg2)

これは、greatestある型と互換性のある代入である 2 つのインスタンスを取りT、同じ型のインスタンスを返すメソッドであることを意味します。(そして、名前から、greatest返される値が 2 つの引数の大きい方であると推測するのは合理的です。)

2 番目の部分は次のとおりです (構文エラーが修正されていると仮定します)。

<T extends Comparable<T>>

これは、型がその型パラメーターとしてインターフェイスをT実装する必要があることを意味します。Comparable の javadoc を見ると、単一のメソッドがあることがわかります。ComparableT

public int compareTo(T other);

これは、が (それぞれ) より小さいか、等しいか、または大きいかに応じて、ゼロ未満、ゼロ、またはゼロより大きい数値と比較thisして返すように指定されます。(javadoc を読んでください!)otherthisother

したがって、基本的にこれは、メソッドTを持つクラスである必要があると言っています。compareToそして、明らかな意図は、greatestメソッドがメソッドを使用compareToて、その2つの引数のうちどちらが大きいかを判断し、それを返すことです。


構文説明に関しては、次の2 つの回答が考えられます。

  • 構文規則は構文規則です。それらに従わなければ、プログラムはコンパイルされません。

  • JLS 設計者は、この時点で汎用構文で または を使用するか、新しいキーワードまたはシンボルを使用するかを選択するimplements必要がありました。extends

    • 新しいキーワードやシンボルを追加すると、言語/ツール チェーンの他の部分に影響が大きすぎるため、「アウト」になります。

    • implementsまたは のいずれかを許可することextendsは冗長であり、不必要な混乱につながる可能性があります。

    • implementsまたはextendsキーワードの他の使用法に基づいて、これらの選択肢のどちらが優れているかについての説得力のある議論は (IMO) ありません。彼らがコイントスに基づいて決定したとしても、私は驚かないでしょう...

于 2012-09-28T13:02:09.800 に答える
0

タイプミスを修正すると、正常にコンパイルされます。

もちろん、 を使用してもう少し柔軟にすることもできますComparable<? super T>

私はかつて、ここで見つけることができる非常によく似たユーティリティメソッドを書きました:

http://softsmithy.sourceforge.net/lib/current/docs/api/softsmithy-lib-core/org/softsmithy/lib/util/Comparables.html#max%28T,%20T%29

于 2012-09-28T13:00:41.773 に答える