2012-03-01 16 views
16

Observé Oracle OTN Virtual Event: Java SE y JavaFX 2.0 (28 de febrero de 2012) y mientras hablaba sobre el nuevo operador de diamantes (esa cosa Map<String, List<String>> myMap = new HashMap<>();) el orador mencionó que no era tan simple de implementar como uno podría pensar, ya que no es un reemplazo de token simple.Operador de diamantes Java 7: ¿por qué fue difícil implementarlo?

Mi pregunta es ¿por qué? ¿Por qué no se puede implementar esto simplemente tomando la cadena de la declaración de la variable y ponerla en el operador de diamante?

+3

Votación máxima. ¿Por qué incluso necesitamos un operador para esto? – Croo

Respuesta

14

No lo implementé tampoco, así que solo puedo adivinar.

Pero generalmente la razón por la que estas cosas son más complejas de lo que parecen es que la primera inspección solo mira el caso de uso más común (o más publicitado). En este caso, es el que mencionaste. En teoría, eso debería ser fácil de especificar exactamente y debería ser bastante fácil de implementar en un compilador.

Sin embargo, el operador de diamante (que no es técnicamente un operador, por cierto) se puede utilizar de diferentes maneras, así:

someMethodWithGenericArguments(new HashMap<>()); 
new SomeGenericClass(new HashMap<>()); 
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter 

En esos casos un simple sustitución del token, obviamente, ya no funciona, necesita una inferencia de tipo real que implique un análisis de tipo real (es decir, que se encuentre en un nivel de abstracción completamente diferente como lo sería un reemplazo de token simple).

+0

Gracias, veo que estas son situaciones realmente más complejas. El primer caso plantea la pregunta de qué pasa si 'someMethodWithGenericArguments()' está sobrecargado con ˙Map ˙ y 'Map ' .. En este caso, el diamante op. me parece totalmente ambiguo ... – jabal

+0

@jabal: ¡pruébalo! Como 'Map ' y 'Map ' tienen el mismo borrado ('Map') no puede tener esas dos sustituciones de un solo método. –

2

Algo que Java no hace (que muchos idiomas tienen) es tipos implícitos en función del uso. es decir, Java no implica un tipo de requerimiento basado en cómo se usa.

p. Ej.

Type a = b; 

El tipo de a y el tipo de b son independientes y no se hacen suposiciones acerca b basado en el tipo de a.

MethodHandles están mostrando signos de apoyar esto. El uso del tipo de devolución puede basarse en el contexto, pero esta es una característica de tiempo de ejecución.

En conclusión, mi suposición es; Fue difícil implementarlo en Java porque el lenguaje no era compatible con ninguno. Si el lenguaje utilizado aparece así todo el tiempo, el enfoque a tomar sería entendido (en términos de definir una especificación de cómo debería funcionar) y respaldado por las herramientas en el compilador.

+3

Por extraño que parezca, el compilador * ya * admite la inferencia de tipo para los argumentos de tipo genérico de * llamadas a métodos *. Pero para la * instanciación de objetos * esa característica se agregó solo con el Operador Diamante. –

Cuestiones relacionadas