我正在尝试使用 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 泛型中指定多重继承,而我只是缺少这种方法?
最佳答案
基本上,编译器正在努力为您变得聪明。它正在为您制定一些界限,并尝试将它们用于 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>
.
关于Java泛型类型转换之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555773/