【发布时间】:2016-01-15 09:12:26
【问题描述】:
对不起,问题标题如此笼统,但不知道如何正确称呼我的问题。
查看Collections.singleton调用的默认结果类型:
Set<Number> numberSingleton =
Collections.singleton((Number) null);
Set<Collection> rawCollectionSingleton =
Collections.singleton((Collection) null);
Set<Collection<String>> stringCollectionSingleton =
Collections.singleton((Collection<String>) null);
Set<? extends Collection<?>> anyCollectionSingleton =
Collections.singleton((Collection<?>) null);
我无法解释的是最后一行。为什么使用? extends Collection<?> 而不是简单的Collection<?>?
这是解决此问题的正确方法吗?
Set<Collection<?>> anyCollectionSingleton =
Collections.<Collection<?>>singleton((Collection<?>) null);
我为什么开始这一切:
我遇到了不编译行的问题:
java.util.Optional.ofNullable((Collection<?>) a).orElse((Collection<?>) b);
这似乎解决了问题,但价格是多少?
java.util.Optional.<Collection<?>>ofNullable((Collection<?>) a).orElse((Collection<?>) b);
【问题讨论】:
-
您的问题是为什么 IDE 会生成那种奇怪的类型?因为 Set
> singleton = Collections.singleton((Collection>) null);工作正常 -
Oracle JDK 1.8.0_40 给我编译错误
java: incompatible types: java.util.Set<java.util.Collection<capture#1 of ?>> cannot be converted to java.util.Set<java.util.Collection<?>>。您使用的是什么 Java 版本? -
有趣。使用 1.8.0_40 直接通过命令行执行
javac不会报告任何错误。使用 IBM JDK 1.6_sr9 的编译仍然会失败并出现“不兼容的类型”错误。