带有通配符和静态包装器的 Java 泛型

标签 java generics

对不起,问题标题太笼统了,但我不确定如何正确地称呼我的问题。

查看 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);

最佳答案

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

与什么一起使用

Set<? extends Collection<?>> anyCollectionSingleton = 
Collections.singleton((Collection<?>) null);

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

所以,这是关于继承的。

关于带有通配符和静态包装器的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34807682/

相关文章:

swift - 试图 swift 概括

Swift:为函数类型专门化泛型类的方法

java - JTree Nimbus Selectionbackground 不适用于 Java 1.8

java - Log4J 文件锁

java - 每当我向远程数据库添加内容时如何通知应用程序用户?

java - 如何使用循环在 Android 应用程序中按顺序选择项目

java - 有没有办法将现有界面变成功能界面?

Java Generics WildCard - 如何在此处将泛型与 Lambda 一起使用?

c# - C# 中的泛型

java - 有支持泛型的 xdoclet 替代品吗?