当前位置:  开发笔记 > 编程语言 > 正文

用于Java Void参考类型?

如何解决《用于JavaVoid参考类型?》经验,为你挑选了7个好方法。

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

final Callable callable = new Callable() {
            public Void call() {
                foobar();
                return null;
            }
        };

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



1> Tom Hawtin -..:

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

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

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


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

2> Peter Lawrey..:

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

Constructor constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

打印像

I have a java.lang.Void@75636731


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

3> Alexander Te..:

Future像魅力一样工作.:)


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

4> Michael Myer..:

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

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

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



5> Luke Woodwar..:

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

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

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

Void.TYPE == void.class

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

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


所以有一个Void.class和一个void.class!

6> Ronan Quille..:

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

public interface LeavesVisitor
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

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

public class MyVoidVisitor implements LeavesVisitor
{
    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;
    }
}



7> Lawrence Dol..:

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

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有