时间:2021-01-11 11:00:35 | 栏目:JAVA代码 | 点击:次
今天在查看源码的时候发现了 java.lang.Void 的类。这个有什么作用呢?
先通过源码查看下
package java.lang; /** * The {@code Void} class is an uninstantiable placeholder class to hold a * reference to the {@code Class} object representing the Java keyword * void. * * @author unascribed * @since JDK1.1 */ public final class Void { /** * The {@code Class} object representing the pseudo-type corresponding to * the keyword {@code void}. */ @SuppressWarnings("unchecked") public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void"); /* * The Void class cannot be instantiated. */ private Void() {} }
从源码中发现该类是final的,不可继承,并且构造是私有的,也不能 new。
那么该类有什么作用呢?
下面是我们先查看下 java.lang.Integer 类的源码
我们都知道 int 的包装类是 java.lang.Integer
从这可以看出 java.lang.Integer 是 int 的包装类。
同理,通过如下 java.lang.Void 的源码可以看出 java.lang.Void 是 void 关键字的包装类。
public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");
Void 使用
Void类是一个不可实例化的占位符类,如果方法返回值是Void类型,那么该方法只能返回null类型。
示例如下:
public Void test() { return null; }
使用场景一:
Future<Void> f = pool.submit(new Callable() { @Override public Void call() throws Exception { ...... return null; } });
比如使用 Callable接口,该接口必须返回一个值,但实际执行后没有需要返回的数据。 这时可以使用Void类型作为返回类型。
使用场景二:
通过反射获取所有返回值为void的方法。
public class Test { public void hello() { } public static void main(String args[]) { for (Method method : Test.class.getMethods()) { if (method.getReturnType().equals(Void.TYPE)) { System.out.println(method.getName()); } } } }
执行结果:
main hello wait wait wait notify notifyAll
ps:下面介绍java.lang.Void 与 void的比较及使用
void关键字表示函数没有返回结果,是java中的一个关键字。
java.lang.Void是一种类型。例如给Void引用赋值null。
Void nil = null;
通过Void类的代码可以看到,Void类型不可以继承与实例化。
public final class Void { /** * The {@code Class} object representing the pseudo-type corresponding to * the keyword {@code void}. */ @SuppressWarnings("unchecked") public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void"); /* * The Void class cannot be instantiated. */ private Void() {} }
Void作为函数的返回结果表示函数返回null(除了null不能返回其它类型)。
Void function(int a, int b) { //do something return null; }
在泛型出现之前,Void一般用于反射之中。例如,下面的代码打印返回类型为void的方法名。
public class Test { public void print(String v) {} public static void main(String args[]){ for(Method method : Test.class.getMethods()) { if(method.getReturnType().equals(Void.TYPE)) { System.out.println(method.getName()); } } } }
泛型出现后,某些场景下会用到Void类型。例如Future<T>
用来保存结果。Future的get方法会返回结果(类型为T)。
但如果操作并没有返回值呢?这种情况下就可以用Future<Void>
表示。当调用get后结果计算完毕则返回后将会返回null。
另外Void也用于无值的Map中,例如Map<T,Void>
这样map将具Set<T>
有一样的功能。
因此当你使用泛型时函数并不需要返回结果或某个对象不需要值时候这是可以使用java.lang.Void类型表示。
总结