2012-11-11 13 views

Odpowiedz

14

Jeśli obiekt (jak ExecutorService), który wymaga, aby zapewnić Callable<T> obiektu, można przekazać mu Callable<Void> aby zaznaczyć, że Callable nic nie wróci. Callable<T> musi być sparametryzowany dla pewnego typu, więc Void jest dostarczany, aby wskazać brak typu.

12

- W przeciwieństwie do innych opakowań Void klasa nie zapisać wartość typu void w sobie i dlatego jest nie owinięcie w prawdziwej esencji.

- Klasa Void według javadoc istnieje ze względu na fakt, że jakiś czas możemy być zmuszeni do reprezentowania słowa kluczowego void jako obiekt.

- Ale w tym samym momencie mamy nie można utworzyć instancję klasy Odpada przy użyciu nowego operator.This dlatego konstruktor w Pustki został zadeklarowane jako prywatny. Ponadto klasa Void jest klasą ostateczną, co oznacza, że ​​nie ma możliwości, abyśmy mogli odziedziczyć tę klasę.

- Więc jedynym celem, który pozostaje na istnienie klasy Void jest odbicie, gdzie możemy uzyskać typ powrót metody jako nieważne.

+0

Nie ma praktyczne zastosowanie '' Lista . –

+0

Ale jeśli chcesz użyć niepraktycznie, 'List ' może być użyty jako bardzo nieefektywny w przestrzeni licznik :-) –

+0

Masz jednak rację. Typ 'void' (non) w Javie nie oznacza tego samego co' void' w C/C++. Typ listy, której nie interesuje typ elementu, to 'List ' ... nie 'List '. –

3

Interfejs API odzwierciedlenia java używa Void.TYPE do reprezentowania typu zwracanego przez metodę zwracającą pustkę, jak wskazuje Luke Woodward. (Returning Void.class, jak wcześniej sądziłem, spowodowałoby niejednoznaczność powracających metod, deklarując typ powrotu java.lang.Void).

void test(){...}; 

Method handleForTest = ...; 
assert(handleForTest.getReturnType() == Void.TYPE); 

post Java 1.5 Pustka może być stosowany w klasach ogólnych, aby wskazać, że nie zwraca wartości - wdrożenie nadal musi zwrócić null, ale może być ignorowane, ponieważ jest to jedyna poprawna wartość dla typu Unieważnić.

interface<T> Example{ 
     //Implementations may do something and return a result 
     T doSomeThing(); 
} 

class ExampleVoid implements Example<Void>{ 
     //does something without returning a result 
     Void doSomething(){return null;} 
} 

także Java pozwala nadać bardziej konkretny typ zwracany podczas nadpisywania metody, to jest w zasadzie taki sam jak w przykładzie powyżej generycznych, żeby pokazać, że działa bez leków generycznych, jeśli oryginalny typ zwracany jest obiekt.(Jest ona ograniczona do obiektów, ponieważ brak kieruje się tymi samymi zasadami jak każdy inny rodzaj java, niestety nie ma sposobu, aby skorzystać z bezimiennego zerowej typu dla tego)

interface Example{ 
     //Implementations may do something and return a result 
     Object doSomeThing(); 
} 

class ExampleVoid implements Example{ 
     //does something without returning a result 
     Void doSomething(){return null;} 
} 
+0

Interfejs Java Reflections używa 'void.class' jako typu zwracającego' void', a nie 'Void.class'. W pierwszym przykładzie twierdzenie nie powiedzie się. –

+0

@LukeWoodward dzięki, zaktualizowałem swoją odpowiedź – josefx

2

JLS#14.8. Expression Statements

przeciwieństwie do C i C++, język programowania Java pozwala używać tylko niektórych form wyrażeń jako instrukcji wyrażenia. Należy zauważyć, że język programowania Java nie pozwala „cast aby unieważnić” - pustka nie jest typem - tak tradycyjny C trick piśmie oświadczenia określenia takie jak:

(void)... ; // incorrect! 

nie praca. Z drugiej strony, język programowania Java pozwala na użycie wszystkich najbardziej użytecznych rodzajów wyrażeń w wyrażeniach i nie wymaga wywoływania metody używanego jako instrukcja wyrażenia w celu wywołania metody void, więc taka sztuczka prawie nigdy nie jest potrzebna. Jeśli potrzebna jest sztuczka, można zamiast tego użyć instrukcji przypisania (§ 15.26) lub instrukcji deklaracji zmiennej lokalnej (§14.4).

JLS#15.8.2. Class Literals

Typ void.class (§8.4.5) jest Class<Void>.

JLS#8.4.5. Method Return Type

Wynikiem deklaracji metody albo deklaruje typ wartości, która powraca metodą (typ zwracany) lub wykorzystuje pustkę słów kluczowych, aby wskazać, że metoda nie zwraca wartości .

Java doc Void

Klasa brak jest uninstantiable klasa zastępczy trzymać referencję do obiektu klasy reprezentującego kluczowego pustkę Java.

Jest on używany do celów refleksji podczas chcesz sprawdzić typ zwracanej metody

if (getClass().getMethod("someMethod").getReturnType() == Void.TYPE) 

samo dotyczy metod generycznych.

final Callable<Void> callable = new Callable<Void>() { 
     public Void call() { 
      return null; 
     } 
    }; 
2

Powody

Typ Void został wprowadzony w celu umożliwienia połączeń oparć oraz interfejsów z systemami zewnętrznymi (JNI, JavaScript połączenia z apletów, etc ...) i ma już od czasów Java 1.1 dla takich przypadków, w których typ interfejsu nie jest znany lub wymuszany przez inny interfejs (a zatem tam, gdzie nie można używać void keyword). Zaprojektowano Javę - z wyjątkiem prymitywów i odwołań zerowych - jako języka "wszystko jest przedmiotem", do wskazania braku oczekiwanych typów potrzebna była obojętna owijka/symbol zastępczy.

Definicja

Sposób, jak określono w sekcji method return type z JLS (§8.4.5), wymaga ma formalne podać w Zwraca typ:

wynikiem zgłoszenia metody albo deklaruje typ o wartości , która zwraca metodę (typ zwracany) lub używa słowa kluczowego void do , oznacza, że ​​metoda nie zwraca wartości.

Jak wspomniano w sekcji JLS dla Class Literals (§15.8.2):

Rodzaj void.class (§8.4.5) jest Class<Void>

ogólne Zastosowanie

Jego użycie stało się bardziej widoczne wraz z wprowadzeniem generyków w Javie 5, ponieważ pozwoliło to na ich zdefiniowanie interfejsy do korzystania z generycznych i pozwoliłyby sprawdzić typ użycia tych interfejsów i wywołań zwrotnych. Wcześniej, czasami realizator musiał wiedzieć, że nie było przejeżdżanego obiektu lub obiektu powrotu, na przykład w przypadku uprzywilejowanego bloku wykonawczego z użyciem AccessController, bardzo często używanego w Aplecie do definiowania bezpiecznych ścieżek kodu:

somemethod() { 
    // ...normal code here... 
    AccessController.doPrivileged(new PrivilegedAction<Void>() { 
     public Void run() { 
      // privileged code goes here, for example: 
      System.loadLibrary("awt"); 
      return null; // nothing to return 
     } 
    }); 
    // ...normal code here... 
} 

zauważyć różnicę z Java 1.4 version of this same code, gdzie nie było jasne (i typ-safe) do rozmówcy, że nic nie jest zwracany:

somemethod() { 
     // ...normal code here... 
     AccessController.doPrivileged(new PrivilegedAction() { 
      public Object run() { 
       // privileged code goes here, for example: 
       System.loadLibrary("awt"); 
       return null; // nothing to return 
      } 
     }); 
     // ...normal code here... 
    } 

Inne dokumenty i podobne pytania

Powiązane problemy