Java での void と Void の違い
java.lang.Void タイプは、java.lang.Integer に類似しています。Void は void をラップアラウンドしてオブジェクトクラスを拡張し、void には可能な値がないため、java.lang.Void はインスタンス化できません。
私たちは、Java プログラミングにおける Void と void の違いを見つけて理解することを目指しています。また、Java プログラミングで Void または void を使用する方法と場所についても学習します。
Java の void と Void の違い
両方(Void と void)の基本的な違いは、void がプリミティブ型であるのに対し、Void は Object から継承する参照型であるということです。それらのどれも可能な値を持っていませんが、両方とも異なるタイプです。
void(すべて小文字)は、値が存在しないことを示すために使用される不適切なタイプです。目立たない値がないため、void は関数またはメソッドによって値が返されないことを意味します。
一方、java.lang.Void はオブジェクトを返し、null を返して合法的に物事を行うことができます。これが唯一の方法です。外部からアクセスできないプライベートコンストラクターがあるため、インスタンス化できません。
Java で void と Void を使用する
メソッドが値を返さないようにする場合は、void(すべて小文字)を使用します。次の例のように、printMessage() メソッドは何も返しませんが、画面にメッセージを出力します。
void(Main.java)のサンプルコード:
public class Main {
static void printMessage() {
System.out.println("printMessage function just got executed!");
}
public static void main(String[] args) {
printMessage();
}
}
void キーワードをオブジェクトとして提示する必要がある場合があるため、Java プログラミングでリフレクションを行うときに Void(最初の文字を大文字にする)を使用できます。
同時に、Void クラスのオブジェクトを作成することは許可されていません。そのため、そのコンストラクターはプライベートであり、外部からアクセスすることはできません。
さらに、final クラスであるため、Void クラスを継承することはできません。これにより、リフレクションで Void を使用することになります。ここで、メソッドの戻り型は void として取得されます。
Void(Main.java)のサンプルコード:
public class Main {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class c1 = TestOne.class.getMethod("Test", (Class<?>[]) null).getReturnType();
System.out.println(c1 == Void.TYPE); // true
System.out.println(c1 == Void.class); // false
}
}
Void(TestOne.java)のサンプルコード:
class TestOne {
public void Test() {}
}
出力:
True
False
ジェネリックスを使用して、メソッドの戻り型を void として取得することもできます。何かに対して void を返すことができる汎用クラスのコードを記述したいと思います。
abstract class Foo<T> {
abstract T bar();
}
class Bar extends Foo<Void> {
Void bar() {
return (null);
}
}
出力:
True
False
