2012-05-11 2 views
6

Я пытаюсь использовать класс Guava ImmutableSet Google для создания набора неизменяемых классов со временными свойствами (java.util.Date и org.joda.time.DateTime).Java Generics type conversion puzzle

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

Я полностью в тупике относительно того, почему я получаю эту ошибку компилятора (Java 1.6 в затмении).

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

Обратите внимание, что это работает:

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

Однако я, очевидно, свободная часть общего описания типа timeLikeObjects.

Я никогда не сталкивался с символом амперсанда в общем описании, и он не представляется допустимым синтаксисом.

Есть ли способ указать множественное наследование в Java Generics, которое мне просто не хватает?

ответ

17

В основном компилятор пытается быть умным для вас. Он разрабатывает некоторые ограничения для вас и пытается использовать их для возвращаемого типа of.

К счастью, вы можете исправить это, будучи явным:

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

& часть является действительным синтаксисом - это, как вы определяете границы для нескольких типов, например,

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

Это означает, что вы можете только указать типы для T, который реализует SerializableиComparable<T>.

+0

Jon Это был чрезвычайно просветляющий ответ. Вы - решение, отлично работает. Благодаря! :) –