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