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);
}
}
a wyjście jest:Jak generics w java działa dla następującego programu?
10-->1
nie byłem w stanie znaleźć żadnych istotnych dyskusji na ten temat. Jednak odpowiedź na innym temacie mylić mnie trochę: - Return Type of Java Generic Methods
Według nich ogólny <Program>
nie ma nic wspólnego z rodzaju powrót, ale w moim przypadku, jeśli zmienię trochę do tego programu, jak poniżej to wyjście jest inny.
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);
}
}
wyjściowa:
10-->2
Używam JDK1.7
W twoim drugim przykładzie, tylko druga wersja 'foo()' ma podpis, który można dopasować do tego, co wywołujesz w 'main()'. W pierwszym przykładzie musi istnieć reguła poprzedzająca, która dopasowuje wywołanie "Integer" do funkcji ogólnej przed rozpakowaniem i rozważa alternatywę. –
Definiujesz nowy rodzajowy parametr 'Program' w tym wierszu:' private static void foo (Program x) {'. Ten parametr typu nie ma nic wspólnego z twoją klasą o nazwie 'Program'.Kiedy zmienisz nazwę parametru typu na "Integer", parametr 'Program x' nagle ma typ twojej aktualnej klasy' Program'. Lekcja: nie nadaj nazw parametrom typu istniejącym klasom faktycznym. –
marstran
Twój kod będzie łatwiejszy do zrozumienia, jeśli nazwy parametrów generycznych będą zgodne z konwencją literowania jedną wielką literą. Bez względu na to, jest beznadziejnie mylące, gdy nazwiesz je tak samo jak konkretny typ, a tym bardziej taki, który znajduje się w zakresie. Oddzielić nazwy parametrów generycznych od nazw typów! –