当前位置: 首页 > 知识库问答 >
问题:

Java泛型中的Void和无界通配符有什么区别?

司空鸣
2023-03-14

在Java泛型中,Void类型的对象和无界通配符类型的对象有什么区别?我的意思是我理解<?>的用法,也理解Void在反射方面的用法,但是当我看到

java.util.concurrent.AbstractExecutorService
public Future<?> submit(Runnable task) {
    ...
    RunnableFuture<Void> ftask = new TaskFor(task, null);
    ...
    return ftask;

有人能帮我了解一下这背后的原因吗?谢谢

共有1个答案

何灿
2023-03-14

Void是一个特殊的类,用于表示不返回值。虽然void本身并没有什么特别之处,但是它不能(也从来没有)被实例化,所以它唯一可能的值总是null。它用于两件事:

  1. 表示泛型方法或类没有返回值。
  2. 使用void.type表示Java反射中的void返回类型。例如,请参见如何通过反射确定方法是否返回'void'。

因此,它与通配符非常不同,通配符不是实际的类,而是在编译时表示一个特定的未知类型。在运行时,它会像其他泛型类型一样被擦除。

public Future<?> submit(Runnable task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<Object> ftask = newTaskFor(task, null);
    execute(ftask);
    return ftask;
}

和JDK 7:

public Future<?> submit(Runnable task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<Void> ftask = newTaskFor(task, null);
    execute(ftask);
    return ftask;
}

正如您所看到的,只有在JDK 7中才将类型更改为void,这可能是因为它在概念上更有意义。但是,由于无法更改该方法的接口(出于兼容性原因,并且由于该方法实现ExecutorService接口的Future<?>submit(可运行任务)),因此返回类型Future<?>保持不变。这就是我的解释。

 类似资料:
  • 问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个

  • 根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者

  • 我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?

  • 问题内容: 我有一个接口将对象转换为字符串: 以及用于存储所有可用转换器的地图: 现在,我有了要转换的异构数据列表,如下所示: 但是此代码无法编译: 我应该如何更改代码? 问题答案: 您面临的问题称为通配符捕获。Java无法识别将从数据中接收的类型。尝试以两种方式中的任何一种重构代码 方法1:如下 更改您的界面 方法2: 通过类型推断来捕获通配符的Helper方法 创建如下的帮助方法, 如下调用此

  • 上限通配符下限通配符 有人能帮我理解一下吗?

  • null 编译,我真的不明白为什么。基本上与第1行相同的问题。是的超类,如何将超类的成员放入此中? 编译。与第1行相同的问题。

  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • 问题内容: 您能帮助我了解 无界通配符类型列表 和 原始类型列表 之间的区别吗? 除此之外,有人可以帮助我了解什么是有 界类型参数列表 ? 问题答案: 以下是这三个的摘要: :没有类型参数的列表。它是一个列表,其元素可以是任何类型- 元素可以是不同类型 。 :具有无限制类型参数的列表。它的元素是特定但未知的类型。 元素必须都是相同的类型 。 :带有类型参数称为的列表。所提供的类型必须是extens