2012-01-30 6 views
8

¿Por qué no se compila Map<String, ?> test = ImmutableMap.builder().build();, pero Map<String, ?> test = ImmutableMap.<String, Object>builder().build(); funciona bien?¿Por qué ImmutableMap.builder(). Build() no elige los parámetros de tipo correctos?

La primera sniplet código falla con:

error: incompatible types 
    Map<String, ?> test = ImmutableMap.builder().build(); 
               ^
    required: Map<String,?> 
    found: ImmutableMap<Object,Object> 

Creo que los committers guayaba pensados ​​para que esto funcione.

Respuesta

16

Esto no es un fracaso en Guava, sino más bien en la forma en que Java resuelve los genéricos, y es algo que no podemos controlar. = (

Créanos:. Esto es algo que nos pasamos un montón de tiempo en este issue, Kevin menciona que hemos intentado no menos de quince enfoques para tratar de conseguirlo de modo que usted no tiene que explícitamente especifique estos parámetros de tipo.

Si solo está interesado en el caso de ImmutableMap.builder().build(), es decir, sin entradas en el mapa ... entonces debería estar usando ImmutableMap.of(). Eso no tendrá ningún problema extraño con genéricos: simplemente va a funcionar.

+0

¿Es esto algo que podría corregirse en el lenguaje? Es decir, ¿podemos presentar un informe de error con Oracle? – Gili

+0

No ... probablemente, me temo. Si no lo incluyeron en la inferencia de tipo aumentado con el operador de diamante en Java 7, dudo que puedan incluirlo en absoluto. Probablemente haya algunos casos extremos extraños que serían imposibles de manejar por alguna razón, pero no estoy seguro de los detalles. –

+0

@Gili: Sé que hay algo de trabajo para mejorar la inferencia de tipos para Java 8 ... esto _puede ser algo que pueda inferirse con las reglas mejoradas, no estoy seguro. – ColinD

Cuestiones relacionadas