Qual é a maneira correta de retornar um Void
tipo, quando não é um primitivo? Por exemplo. Atualmente, uso null como abaixo.
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
java
generics
return-value
Robert
fonte
fonte
Respostas:
Portanto, qualquer uma das opções a seguir seria suficiente:
Object
e retornandonew Object()
ounull
Void
e retornandonull
NullObject
seuVocê não pode fazer este método
void
e qualquer outra coisa retorna algo . Como esse algo é ignorado, você pode retornar qualquer coisa.fonte
return (Void)null;
Java 8 introduziu uma nova classe,,
Optional<T>
que pode ser usada em tais casos. Para usá-lo, você modificaria seu código ligeiramente da seguinte maneira:Isso permite que você garanta que sempre obterá um valor de retorno não nulo de seu método, mesmo quando não houver nada para retornar. Isso é especialmente poderoso quando usado em conjunto com ferramentas que detectam quando
null
pode ou não pode ser retornado, por exemplo, o Eclipse@NonNull
e@Nullable
anotações.fonte
Optional<Void>
é desnecessário pelo mesmo motivo que você forneceu, você sempre obtém umOptional<Void>
que está vazio e, portanto, todos os outros métodos são inúteis. Isso é o oposto do motivo pelo qual um valor opcional deve ser usado. Você o usa porque pode ou não ter um valor. Além disso, o compilador não pode impor que omethod()
implemente corretamente. Este seria um fracasso em tempo de execução:return Optional.of(null)
.Se você simplesmente não precisa de nada como seu tipo, pode usar void. Isso pode ser usado para implementar funções ou ações. Você poderia então fazer algo assim:
Ou você pode omitir a classe abstrata e retornar null em todas as ações que não exigem um valor de retorno.
Você pode então usar essas ações como esta:
Dado um método
você pode chamá-lo assim
ou, para a ação anular (observe que você não está atribuindo o resultado a nada)
fonte
Só por causa disso, é claro que existe a possibilidade de criar
Void
instância usando reflexão:Você provavelmente não fará isso na produção.
fonte
Não existe um tipo genérico que diga ao compilador que um método não retorna nada.
Acredito que a convenção é usar Object ao herdar como um parâmetro de tipo
OU
Propague o parâmetro de tipo e deixe os usuários de sua classe instanciarem usando Object e atribuindo o objeto a uma variável digitada usando um caractere curinga
?
:fonte
A<?>
não poderá fazer uso do valor retornado demethod()
.