2012-05-11 18 views
6

Sto tentando di utilizzare la classe Guava ImmutableSet di Google per creare un insieme di classi immutabili con proprietà timelike (java.util.Date e org.joda.time.DateTime).Java Generics type conversion puzzle

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

Sono completamente perplesso sul motivo per cui sto ottenendo questo errore di compilazione (Java 1.6 in Eclipse).

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

noti che questo funziona:

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

Comunque parte ovviamente allentata della descrizione generica del tipo timeLikeObjects.

Non ho mai incontrato il simbolo e commerciale in una descrizione generica e non sembra essere una sintassi valida.

C'è un modo per specificare l'ereditarietà multipla in Java Generics che mi manca?

risposta

17

Fondamentalmente il compilatore sta cercando di essere intelligente per te. Sta elaborando alcuni limiti per te e sta cercando di usarli per il tipo restituito di of.

Fortunatamente, è possibile risolvere il problema con l'essere esplicito:

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

La & parte è sintassi valida - è come specificare limiti per più tipi, per esempio

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

Questo significa che è possibile specificare solo i tipi di T che implementano SerializableeComparable<T>.

+0

Jon questa è stata una risposta estremamente illuminante. La tua soluzione funziona perfettamente. Grazie! :) –