vectores una tipos multidimensionales matriz llenar ejemplos declarar como arreglos array java arrays local-variables java-10

una - tipos de arreglos en java



“El inicializador de matriz necesita un tipo de objetivo explícito”: ¿por qué? (2)

Cada vez que mejoramos el alcance de la inferencia de tipos en Java, obtenemos una serie de "pero también podrías inferir esto, ¿por qué no?" (O a veces, menos cortésmente.)

Algunas observaciones generales sobre el diseño de esquemas de inferencia de tipos:

  • Los esquemas de inferencia siempre tendrán límites; siempre hay casos en el margen donde no podemos inferir una respuesta, o terminar inferiendo algo sorprendente. Cuanto más intentemos inferir todo, más probabilidades tendremos de inferir cosas sorprendentes. Esta no es siempre la mejor compensación.
  • Es fácil elegir ejemplos de "pero seguramente puedes inferir en este caso". Pero si tales casos son muy similares a otros casos que no tienen una respuesta obvia, simplemente hemos cambiado el problema: "¿por qué funciona para X pero no para Y donde X e Y son ambos Z?"
  • Siempre se puede hacer un esquema de inferencia para manejar casos incrementales, pero casi siempre hay daño colateral, ya sea en la forma de obtener un peor resultado en otros casos, mayor inestabilidad (donde los cambios aparentemente no relacionados pueden cambiar el tipo inferido), o más complejidad . No desea optimizar solo para el número de casos que puede inferir; También desea optimizar la capacidad de un usuario educado para predecir qué funcionará y qué no. Dibujar líneas más simples (por ejemplo, no se moleste en intentar inferir el tipo de inicializadores de matriz) a menudo es una ganancia aquí.
  • Dado que siempre hay límites, a menudo es mejor elegir un objetivo más pequeño pero mejor definido, porque eso simplifica el modelo de usuario. (Consulte las preguntas relacionadas en "¿por qué no puedo usar la inferencia de tipo para el tipo de retorno de los métodos privados? La respuesta es que podríamos haberlo hecho, pero el resultado sería un modelo de usuario más complicado para un pequeño beneficio expresivo. Lo llamamos" pobre retorno de la complejidad ".

Descripción de JEP 286: Inferencia de tipo de variable local

Me pregunto, ¿cuál es la razón para introducir tal restricción, como:

Main.java:199: error: cannot infer type for local variable k var k = { 1 , 2 }; ^ (array initializer needs an explicit target-type)

Así que para mí lógicamente debería ser:

var k = {1, 2}; // Infers int[] var l = {1, 2L, 3}; // Infers long[]

Debido a que el compilador de Java ya puede inferir correctamente el tipo de una matriz:

void decide() { arr(1, 2, 3); // call void arr(int ...arr) arr(1, 2L, 3); // call void arr(long ...arr) } void arr(int ...arr) { } void arr(long ...arr) { }

Entonces, ¿cuál es el impedimento?


Desde la plataforma de listas de correo-jep-Discuss, mensaje Bolsa de correo de Reader para el jueves (jueves 10 de marzo 15:07:54 UTC 2016) por Brian Goetz:

  1. ¿Por qué no es posible utilizar var cuando el inicializador es un inicializador de matriz, como en:

    var ints = { 1, 2, 3 }

La regla es: derivamos el tipo de la variable tratando el inicializador como una expresión independiente y derivando su tipo. Sin embargo, los inicializadores de arrays, como las lambdas y las referencias a los métodos, son expresiones poli , necesitan un tipo de destino para poder calcular su tipo. Así que son rechazados.

¿Podríamos hacer este trabajo? Probablemente podríamos Pero agregaría mucha complejidad a la característica, para el beneficio de un caso mayormente de esquina. Nos gustaría que esta sea una característica simple.

El inicializador de matriz de mano corta toma su información de tipo de la declaración, pero como la declaración aquí es var , debe especificarse explícitamente.

Tendrás que elegir entre:

var k = new int[]{ 1 , 2 };

o

int[] k = { 1 , 2 };

Permitir var k = { 1 , 2 } cambiaría la semántica de algo que ya es azúcar sintáctico. En el caso de int[] n = { 1, 2 } el tipo está determinado por la declaración. Si permite var n = { 1, 2 } el tipo de inicialización lo determina de repente el propio inicializador. Esto podría llevar a errores (compilaciones) o ambigüedades (más fáciles de crear).