public class Program {
private static <Program> void foo(Program x){
System.out.println(x+"-->1");
}
private static void foo(final int i){
System.out.println(i+"-->2");
}
public static void main(String[] args) {
Integer i = 10;
foo(i);
}
}
、出力は次のとおりです。次のプログラムのjavaのジェネリックスはどのように機能しますか?
10-->1
私はこのトピック上の任意の関連する議論を見つけることができませんでした。しかし、別のトピックへの答えは私を少し混乱: - Return Type of Java Generic Methods
私はその後、以下のように、このプログラムに出力を少し変更した場合、それらによると、一般的な<Program>
は、戻り値の型ではなく、私の場合には何の関係もありません異なります。
public class Program {
private static <Integer> void foo(Program x){
System.out.println(x+"-->1");
}
private static void foo(final int i){
System.out.println(i+"-->2");
}
public static void main(String[] args) {
Integer i = 10;
foo(i);
}
}
は出力:
10-->2
私は、最初のケースではJDK1.7
2番目の例では、 'foo()'の2番目のバージョンだけが、 'main()'で呼び出しているものに一致する署名を持っています。最初の例では、ボックス化を解除する前にジェネリック関数への 'Integer'呼び出しと一致する優先ルールがなければなりません。 –
この行に新しい汎用タイプのパラメータ 'Program'を定義しています:' private static void foo(Program x){'。その型パラメータは 'Program'という名前のクラスとは何の関係もありません。型パラメータの名前を 'Integer'に変更すると、パラメータ' Program x'はあなたの実際のクラス 'Program'の型を突然持ちます。レッスン:存在する実際のクラスに型パラメータを指定しないでください。 –
marstran
ジェネリックスのパラメータ名が大文字で表記されている場合は、コードを簡単に実行できます。それにもかかわらず、具体的な型と同じ名前をつけると、混乱する可能性があります。あなたのタイプ名からジェネリックパラメータ名を分離してください! –