【问题标题】:Java generics with wildcards and static wrappers带有通配符和静态包装器的 Java 泛型
【发布时间】: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&lt;?&gt; 而不是简单的Collection&lt;?&gt;

这是解决此问题的正确方法吗?

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&lt;java.util.Collection&lt;capture#1 of ?&gt;&gt; cannot be converted to java.util.Set&lt;java.util.Collection&lt;?&gt;&gt;。您使用的是什么 Java 版本?
  • 有趣。使用 1.8.0_40 直接通过命令行执行javac 不会报告任何错误。使用 IBM JDK 1.6_sr9 的编译仍然会失败并出现“不兼容的类型”错误。

标签: java generics


【解决方案1】:

不,这是一个完全不同的概念。

一起使用的意义
Set<? extends Collection<?>> anyCollectionSingleton = 
Collections.singleton((Collection<?>) null);

是你有一个泛型类,它扩展了泛型类的集合。

所以,这是关于继承的。

【讨论】:

  • 但是为什么Collection&lt;String&gt; 的大小写不一样呢?
  • 一般来说,String 类似于一个独立的类,因为它直接继承自 Object 类,而例如 Integer 类继承自 Number。这对你的情况足够了吗?如果您的意思是别的,举个例子可能会有所帮助。
  • 我的意思是为什么 Collection&lt;String&gt; 产生 Set&lt;Collection&lt;String&gt;&gt; 而不是 Set&lt;? extends Collection&lt;String&gt;&gt; 然后就像在 Collection&lt;?&gt; 案例中一样?
  • 因为String 类与任何其他Java 类没有任何继承关系,除了显而易见的Object 类,所有类都从该类继承。也就是说,没有任何 String 扩展的类(我不计算明显的类 -> Object)并且因为像 String extends Object 这样的定义从语言/编译器本身是显而易见的,它只是被跳过.
  • 我还是没明白你的意思。让我们将 String 示例替换为泛型类型 T(例如在方法中定义)。结果仍然是Set&lt;Collection&lt;T&gt;&gt; 而不是Set&lt;? extends Collection&lt;T&gt;&gt;。如果我使用不相关的类型而不是 SetCollection,我认为我的示例可能会更简单,例如可选。
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多