Java泛型类型转换之谜

标签 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 泛型中指定多重继承,而我只是缺少这种方法?

最佳答案

基本上,编译器正在努力为您变得聪明。它正在为您制定一些界限,并尝试将它们用于 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/

相关文章:

java - 如何使用关闭 Hook 优雅地停止 Guava AbstractScheduledService?

java - 软/弱键 MapMAker,键等于

java - 如何使用 Guava 泛型来转换这张 map ?

java - 将日期或日历类型转换为字符串格式

c# - 使用 switch 和枚举代替命名方法

generics - 通用参数上的 F# 模式匹配

c# - 有参数类型限制的泛型类型不能传递给有非泛型参数的方法

java - Windows 7 上不会为已安装的应用程序创建 hs_err_pid 文件

java - 用Spring MVC内容协商响应html、json和xml

java - 打破java泛型命名约定?