Jaki jest prawidłowy sposób zwracania Void
typu, jeśli nie jest to typ pierwotny? Na przykład. Obecnie używam null, jak poniżej.
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
java
generics
return-value
Robert
źródło
źródło
Odpowiedzi:
Wystarczyłoby więc jedno z poniższych:
Object
i zwracanienew Object()
lubnull
Void
zi zwracanienull
NullObject
TwoimNie możesz zrobić tej metody
void
, a cokolwiek innego coś zwraca . Ponieważ to coś jest ignorowane, możesz zwrócić wszystko.źródło
return (Void)null;
Java 8 wprowadziła nową klasę
Optional<T>
, która może być używana w takich przypadkach. Aby z niego skorzystać, zmodyfikuj nieco swój kod w następujący sposób:Pozwala to upewnić się, że z metody zawsze zostanie zwrócona wartość niezerowa, nawet jeśli nie ma nic do zwrócenia. Jest to szczególnie przydatne w połączeniu z narzędziami, które wykrywają, kiedy
null
można lub nie można zwrócić, np. Eclipse@NonNull
i@Nullable
adnotacje.źródło
Optional<Void>
jest niepotrzebne z tego samego powodu, który podajesz, zawsze otrzymujeszOptional<Void>
pustą, więc wszystkie inne metody są bezcelowe. Jest to przeciwieństwo tego, dlaczego należy używać wartości opcjonalnej. Używasz go, ponieważ może mieć wartość lub nie. Kompilator nie może również wymusić, żemethod()
implementuje go poprawnie. To byłoby nie w czasie wykonywania:return Optional.of(null)
.Jeśli po prostu nie potrzebujesz niczego jako swojego typu, możesz użyć void. Można to wykorzystać do implementacji funkcji lub akcji. Możesz wtedy zrobić coś takiego:
Możesz też pominąć klasę abstrakcyjną i samodzielnie zwrócić wartość null w każdej akcji, która nie wymaga zwracania wartości.
Następnie możesz użyć tych akcji w następujący sposób:
Biorąc pod uwagę metodę
możesz to nazwać jak
lub, dla akcji void (pamiętaj, że nie przypisujesz wyniku do niczego)
źródło
W tym celu istnieje oczywiście możliwość stworzenia
Void
instancji za pomocą refleksji:Prawdopodobnie nie zrobisz tego w produkcji.
źródło
Nie ma typu ogólnego, który powie kompilatorowi, że metoda nic nie zwraca.
Uważam, że konwencja polega na używaniu Object podczas dziedziczenia jako parametru typu
LUB
Propaguj parametr typu w górę, a następnie pozwól użytkownikom Twojej klasy na tworzenie instancji przy użyciu Object i przypisywanie obiektu do zmiennej wpisanej przy użyciu symbolu wieloznacznego typu
?
:źródło
A<?>
nie będzie mógł w żaden sposób wykorzystać zwróconej wartościmethod()
.