2012-05-11 23 views
6

Próbuję użyć klasy Guava ImmutableSet Google do stworzenia zestawu niezmiennych klas o właściwościach czasowych (java.util.Date i org.joda.time.DateTime).Typowa konwersja typu Java Generic

private static final ImmutableSet<Class<?>> timeLikeObjects = ImmutableSet.of(Date.class, DateTime.class); 

Jestem całkowicie zaskoczony, dlaczego otrzymuję ten błąd kompilatora (Java 1.6 w eclipse).

Type mismatch: cannot convert from ImmutableSet<Class<? extends Object&Serializable&Comparable<? extends Comparable<?>>>> to ImmutableSet<Class<?>> 

Zauważ, że to działa:

private static final ImmutableSet<?> timeLikeObjects = ImmutableSet.of(Date.class, DateTime.class); 

Jednak ja oczywiście luźna część ogólnego opisu rodzaju timeLikeObjects.

Nigdy nie natknąłem się na znak ampersand w ogólnym opisie i wydaje się, że nie jest to poprawna składnia.

Czy istnieje sposób na określenie dziedziczenia wielokrotnego w Java Generics, którego właśnie brakuje?

Odpowiedz

17

Zasadniczo kompilator stara się być dla ciebie inteligentny. Wypracowuje dla ciebie pewne granice i próbuje użyć ich dla typu zwrotu: of.

Na szczęście, można naprawić poprzez bycie wyraźne:

private static final ImmutableSet<Class<?>> timeLikeObjects = 
    ImmutableSet.<Class<?>>of(Date.class, DateTime.class); 

& część jest Poprawna składnia - to w jaki sposób można określić granice dla wielu typów, na przykład

public class Foo<T extends Serializable & Comparable<T>> 

Oznacza to, że można określić tylko typy dla T których realizacji SerializableiComparable<T>.

+0

Jon to była niezwykle pouczająca odpowiedź. Twoje rozwiązanie działa idealnie. Dzięki! :) –