tipos son retorno qué metodos mapa genericos generico generic datos arreglos abstractos java generics overloading

son - ¿Cómo funcionan los genéricos en java para el siguiente programa?



tipos de datos abstractos genericos en java (2)

En el primer caso, Program es el nombre del parámetro genérico utilizado para el método. Puede ser cualquier nombre. Lo importante es que el argumento del método es un Objeto, por lo que cuando llama a su método con un argumento Integer, usa la versión que toma el Objeto.

En el segundo caso, el parámetro genérico se llama Integer (no haga esto) pero el argumento que toma el método es un Programa. Por lo tanto, al llamarlo con un entero, no hay una versión de Object o entero válida, por lo que libera el valor.

En términos de sobrecarga de métodos , que describe el orden en que se resuelve la sobrecarga. Eso le dirá por qué la primera versión usa el método Object lugar del método int .

El segundo problema es que usted ha nombrado a sus parámetros genéricos tipos concretos, lo que es confuso. Es más fácil ver si no haces eso.

private static <T> void foo(T x){ System.out.println(x+"-->1"); }

Ahora está más claro, T es un argumento parametrizado. En tu segunda versión,

private static <T> void foo(Program x){ System.out.println(x+"-->1"); }

Ahora está claro, su argumento debe ser un objeto de Programa, y ​​no cualquier objeto.

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); } }

Y la salida es:

10-->1

No pude encontrar ninguna discusión relevante sobre este tema. Sin embargo, la respuesta a un tema diferente me confundió un poco: - Tipo de retorno de métodos genéricos de Java

Según ellos, el <Program> genérico no tiene nada que ver con el tipo de retorno, pero en mi caso, si cambio un poco a este programa como se muestra a continuación, la salida es diferente.

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); } }

Salida:

10-->2

Estoy usando JDK1.7


En su primer ejemplo, en realidad no está especificando un argumento de tipo Program , es un genérico. Ese tipo de parámetro no tiene nada que ver con su clase llamada Program . Obtendrá el mismo resultado al hacer un error tipográfico como este:

public class Program { private static <Programmmm> void foo(Programmmm 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); } }

Sin embargo, en su segundo ejemplo, el parámetro es literalmente de tipo Program y, por lo tanto, no coincide cuando se llama como foo(10); y obtienes el resultado del segundo método.