Javaの宿題のいくつかに問題があります。これらのジェネリックの概念を理解することはできません。
質問は:
以下がクラスのメソッドヘッダーであると想定します。
public <T implements Comparable <T>>T greatest(T arg1, T arg2)
エラーを見つけますか?
どうすればいいのかよくわかりません。
そのようなものをコンパイルするには、次の方法で変更する必要があります。
public <T extends Comparable <T>> T greatest(T arg1, T arg2)
Comparableはインターフェースですが、このコンテキストでは、extendsは「extends」(クラスの場合)または「implements」(インターフェースの場合)のいずれかを意味するために使用されます。
エラーは、メソッド シグネチャでキーワード 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;
}
どうすればいいのか本当にわからないので、これについての説明が必要です。
署名の意味を説明してほしいと仮定すると...
これは、次の 2 つの部分に分けることができます。
public <T ...> T greatest(T arg1, T arg2)
これは、greatest
ある型と互換性のある代入である 2 つのインスタンスを取りT
、同じ型のインスタンスを返すメソッドであることを意味します。(そして、名前から、greatest
返される値が 2 つの引数の大きい方であると推測するのは合理的です。)
2 番目の部分は次のとおりです (構文エラーが修正されていると仮定します)。
<T extends Comparable<T>>
これは、型がその型パラメーターとしてインターフェイスをT
実装する必要があることを意味します。Comparable の javadoc を見ると、単一のメソッドがあることがわかります。Comparable
T
public int compareTo(T other);
これは、が (それぞれ) より小さいか、等しいか、または大きいかに応じて、ゼロ未満、ゼロ、またはゼロより大きい数値と比較this
して返すように指定されます。(javadoc を読んでください!)other
this
other
したがって、基本的にこれは、メソッドT
を持つクラスである必要があると言っています。compareTo
そして、明らかな意図は、greatest
メソッドがメソッドを使用しcompareTo
て、その2つの引数のうちどちらが大きいかを判断し、それを返すことです。
構文の説明に関しては、次の2 つの回答が考えられます。
構文規則は構文規則です。それらに従わなければ、プログラムはコンパイルされません。
JLS 設計者は、この時点で汎用構文で または を使用するか、新しいキーワードまたはシンボルを使用するかを選択するimplements
必要がありました。extends
新しいキーワードやシンボルを追加すると、言語/ツール チェーンの他の部分に影響が大きすぎるため、「アウト」になります。
implements
または のいずれかを許可することextends
は冗長であり、不必要な混乱につながる可能性があります。
implements
またはextends
キーワードの他の使用法に基づいて、これらの選択肢のどちらが優れているかについての説得力のある議論は (IMO) ありません。彼らがコイントスに基づいて決定したとしても、私は驚かないでしょう...
タイプミスを修正すると、正常にコンパイルされます。
もちろん、 を使用してもう少し柔軟にすることもできますComparable<? super T>
。
私はかつて、ここで見つけることができる非常によく似たユーティリティメソッドを書きました: