2013-11-08 6 views
1

РедактироватьПочему существует класс Void?

Это прежде всего вопрос о том, почему класс существует, а не обыкновения класса. Вопрос Uses for the Java Void Reference Type? фокусируется на фактических обычаях, где этот вопрос требует обоснования его реализации.


Java имеет коробочную класс Void для ключевого слова типа возвращаемого void.

Из документов:

Класс Пустоты является uninstantiable класса заполнителя содержать ссылку на объект класса, представляющего пустоту ключевого слова Java.

Единственная ситуация, я видел этот класс используется с обобщениями, например, следующее:

interface Foo<R> { 
    R foo(); 
} 

Foo<Void> foo = new Foo<Void>(){ 
    @Override 
    public Void foo() { 
     return null; // `return;` and `return void;` are syntax errors 
    } 
} 

Примером этого является андроида AsyncTask.

Приведенный выше пример кажется совершенно бессмысленным, так как метод делает не возврата void, он всегда будет возвращать null.

Так скажите мне, Почему Void есть?

+0

кто downvoted, не прочитав question..I думаю, этот вопрос заслуживает ответа –

+0

Хм ... У этого вопроса не было ответов с действительно полезными примерами. Думаю, это просто потому, что там. – azz

ответ

2

Это требует Reflection API, чтобы представить тип возврата метода пустот, в результате java.lang.reflect.Method.getReturnType(). (Stricly говоря, это void.class, не Void.class, но компилятор принуждает void.class к Void.TYPE.) Он также используется в несколько других мест, как показано в Use page in its Javadoc.

0

Пустота псевдо-типа пустот Держатель

public static final Class<Void> TYPE = Class.getPrimitiveClass("void"); 

Это так 1.1, когда не было дженерики пока. Когда нам нужно void.class, например, здесь

Class rt = Test1.class.getMethod("x").getReturnType(); 
if (rt == void.class) { 
    ... 

компилятор заменяет void.class со ссылкой на java.lang.Void.TYPE

ALOAD 1 
    GETSTATIC java/lang/Void.TYPE : Ljava/lang/Class; 
    IF_ACMPNE 
    ... 
Смежные вопросы