2012-05-11 15 views
6

Estoy intentando utilizar la clase Guava ImmutableSet de Google para crear un conjunto de clases inmutables con propiedades temporales (java.util.Date y org.joda.time.DateTime).Java Generics tipo conversión de rompecabezas

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

Estoy completamente perplejo de por qué estoy obteniendo este error de compilación (Java 1.6 en eclipse).

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

Tenga en cuenta que esto funciona:

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

Sin embargo, yo, obviamente, parte floja de la descripción genérica del tipo timeLikeObjects.

Nunca me encontré con el símbolo de ampersand en una descripción genérica, y no parece ser una sintaxis válida.

¿Hay alguna manera de especificar la herencia múltiple en Java Generics que me falta?

Respuesta

17

Básicamente, el compilador intenta ser inteligente para usted. Está resolviendo algunos límites e intenta usarlos para el tipo de devolución of.

Afortunadamente, se puede arreglar por ser explícita:

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

La parte & es una sintaxis válida - es la forma de especificar límites para varios tipos, por ejemplo,

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

Eso significa que sólo puede especificar los tipos de T que implementan Serializable y Comparable<T>.

+0

Jon fue una respuesta extremadamente esclarecedora. Tu solución funciona a la perfección. ¡Gracias! :) –