Java泛型类型转换难题

Mat*_*lor 6 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);
Run Code Online (Sandbox Code Playgroud)

我完全不知道为什么我得到这个编译错误(eclipse中的Java 1.6).

Type mismatch: cannot convert from ImmutableSet<Class<? extends Object&Serializable&Comparable<? extends Comparable<?>>>> to ImmutableSet<Class<?>>
Run Code Online (Sandbox Code Playgroud)

请注意,这有效:

private static final ImmutableSet<?> timeLikeObjects = ImmutableSet.of(Date.class, DateTime.class);
Run Code Online (Sandbox Code Playgroud)

但是我显然忽略了timeLikeObjects类型的一般描述的一部分.

我从未在通用描述中遇到&符号,并且它似乎不是有效的语法.

有没有办法在Java Generics中指定我刚刚缺少的多继承?

Jon*_*eet 17

基本上编译器试图为你聪明.它正在为你制定一些限制,并尝试将它们用于返回类型of.

幸运的是,您可以通过明确修复它:

private static final ImmutableSet<Class<?>> timeLikeObjects =
    ImmutableSet.<Class<?>>of(Date.class, DateTime.class);
Run Code Online (Sandbox Code Playgroud)

&部分有效的语法 - 它是如何指定多种类型的边界,例如

public class Foo<T extends Serializable & Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

这意味着您只能指定T实现Serializable 和的 类型Comparable<T>.