用于Java Void参考类型?

Jul*_*ang 158 java void

有一个Java Void- 大写的V-- 引用类型.我见过它唯一的情况是参数化Callables

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };
Run Code Online (Sandbox Code Playgroud)

Java Void引用类型还有其他用途吗?可以分配除了以外的任何东西null吗?如果是的话,你有例子吗?

Tom*_*ine 114

Void已经成为你不感兴趣的泛型参数的约定.没有理由你应该使用任何其他非可实例化的类型,例如System.

它也经常被用于例如Map值(虽然Collections.newSetFromMap使用Boolean的地图不具有接受null值)和java.security.PrivilegedAction.

我写了一篇博客文章Void几年前.

  • @barlop这是参数而不是参数名称.也就是说,它是`java.lang.Void`类型./ Josh Bloch推广了大会,虽然一旦你看到它,它是显而易见的选择. (4认同)
  • 该博客条目已死 (2认同)

Pet*_*rey 48

您可以使用反射创建Void实例,但它们对任何事物都没有用.Void是一种表示泛型方法不返回任何内容的方法.

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);
Run Code Online (Sandbox Code Playgroud)

打印像

I have a java.lang.Void@75636731
Run Code Online (Sandbox Code Playgroud)

  • +1用于实例化文档所说的类是不可实现的.我也这样做了,我同意实例化的空洞是没用的. (20认同)
  • 这是特定于实现的,可能随时更改.不能保证类有一个无参数的构造函数,即使它有一个可以做任何事情的东西(也许是`System.exit(0)`).我倾向于使用构造函数编写实用程序类作为`private Void(){throw new Error(); }`.有些人可能更喜欢无价值的枚举. (7认同)

Ale*_*rev 27

Future<Void>像魅力一样工作.:)

  • 使用`Future <?>`更常见(例如,在Guava中),因为未来通常会有一个合法的值(非`void`类型)但是在不关心它的上下文中使用值. (6认同)

Mic*_*ers 19

鉴于没有公共构造函数,我会说除了之外不能分配任何东西null.我只使用它作为"我不需要使用此通用参数"的占位符,如您的示例所示.

它也可以用于反射,它的Javadoc说:

Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用.


Luk*_*ard 17

所有的原始包装类(Integer,Byte,Boolean,Double,等等)包含在静态到对应的原语类的引用TYPE字段,例如:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class
Run Code Online (Sandbox Code Playgroud)

Void最初被创建为某个地方以引入void类型:

Void.TYPE == void.class
Run Code Online (Sandbox Code Playgroud)

但是,通过使用你并没有真正获得任何东西Void.TYPE.当你使用void.class它时,你更清楚你正在做什么void类型的东西.

顺便说一句,我最后一次尝试时,BeanShell没有识别void.class,所以你必须在Void.TYPE那里使用.

  • 所以有一个Void.class和一个void.class! (8认同)

Ron*_*ere 8

使用访问者模式时,如果要确保返回值为null,则可以更清晰地使用Void而不是Object

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}
Run Code Online (Sandbox Code Playgroud)

当您实现访问者时,您可以明确地将OUT设置为Void,以便您知道访问者将始终返回null,而不是使用Object

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)


Law*_*Dol 5

在泛型之前,它是为反射API创建的,用于保存Method.getReturnType()返回的TYPE,用于void方法,对应于其他基本类型类.

编辑:来自Void的JavaDoc:"Void类是一个不可实现的占位符类,用于保存对表示Java关键字void的Class对象的引用".在Generics之前,我意识到除了反射之外别无用处.