Java泛型类型转换难题

时间:2012-05-11 17:11:49

标签: java generics guava

我正在尝试使用Google的Guava ImmutableSet类来创建一组具有时间属性的不可变类(java.util.Date和org.joda.time.DateTime)。

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

我完全不知道为什么我会收到这个编译错误(eclipse中的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中指定我刚刚缺少的多继承?

1 个答案:

答案 0 :(得分: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的{​​{1}}指定类型。