2012-01-30 13 views
8

Dlaczego nie udało się skompilować Map<String, ?> test = ImmutableMap.builder().build();, ale Map<String, ?> test = ImmutableMap.<String, Object>builder().build(); działa poprawnie?Dlaczego metoda ImmutableMap.builder(). Build() nie wybiera poprawnych parametrów?

Pierwszy kod sniplet nie powiedzie się z:

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

Wierzę, że pracach uczestniczyło Guava oznaczało to zadziałało.

Odpowiedz

16

To nie jest porażka w Guava, ale raczej sposób, w jaki Java rozwiązuje generyczne i jest to coś, czego nie możemy kontrolować. = (

Wierzcie nam:. To jest coś, że spędziliśmy dużo czasu na W tym issue Kevin wspomina, że ​​staraliśmy się nie mniej niż piętnaście podejść do staramy się go tak, że nie trzeba jednoznacznie określ parametry tego typu:

Jeśli interesuje Cię tylko przypadek ImmutableMap.builder().build(), tzn. brak wpisów na mapie ... powinieneś używać ImmutableMap.of(). Nie będzie to miało żadnych zabawnych problemów z generics: po prostu zadziała

+0

Czy jest to coś, co można naprawić w języku? Czy możemy zgłosić błąd w Oracle? – Gili

+0

Nie ... prawdopodobne, obawiam się. Jeśli nie uwzględnili tego w rozszerzonej propozycji typu z operatorem diamentów w Javie 7, wątpię, czy w ogóle mogą to uwzględnić. Prawdopodobnie istnieją pewne dziwne przypadki, które z jakiegoś powodu byłyby niemożliwe do przeprowadzenia, ale nie jestem pewien co do szczegółów. –

+0

@Gili: Wiem, że trwają prace nad ulepszeniem wnioskowania o typ Java 8 ... to może być coś, co można wywnioskować dzięki ulepszonym regułom, nie jestem pewien. – ColinD

Powiązane problemy