¿Cuál es la forma correcta de devolver un Void
tipo, cuando no es un primitivo? P.ej. Actualmente uso null como se muestra a continuación.
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
java
generics
return-value
Robert
fuente
fuente
Respuestas:
Entonces, cualquiera de los siguientes sería suficiente:
Object
y devolvernew Object()
onull
Void
y regresarnull
NullObject
tuyoNo puede hacer este método
void
y cualquier otra cosa devuelve algo . Dado que ese algo se ignora, puede devolver cualquier cosa.fuente
return (Void)null;
Java 8 ha introducido una nueva clase,
Optional<T>
, que se puede utilizar en tales casos. Para usarlo, modificaría ligeramente su código de la siguiente manera:Esto le permite asegurarse de obtener siempre un valor de retorno no nulo de su método, incluso cuando no hay nada que devolver. Eso es especialmente poderoso cuando se usa junto con herramientas que detectan cuándo se
null
puede o no se puede devolver, por ejemplo, el Eclipse@NonNull
y las@Nullable
anotaciones.fuente
Optional<Void>
es innecesario por la misma razón que usted da, siempre obtiene unOptional<Void>
que está vacío y, por lo tanto, todos los demás métodos son inútiles. Esto es lo contrario de por qué debería usarse un valor opcional. Lo usa porque puede o no tener un valor. Además, el compilador no puede exigir que lomethod()
implemente correctamente. Esto sería un fracaso en tiempo de ejecución:return Optional.of(null)
.Si simplemente no necesita nada como su tipo, puede usar void. Esto se puede utilizar para implementar funciones o acciones. Entonces podrías hacer algo como esto:
O puede omitir la clase abstracta y hacer el retorno nulo en cada acción que no requiera un valor de retorno usted mismo.
Luego puede usar esas acciones como esta:
Dado un método
puedes llamarlo como
o, para la acción nula (tenga en cuenta que no está asignando el resultado a nada)
fuente
Por el simple hecho de hacerlo, existe, por supuesto, la posibilidad de crear una
Void
instancia mediante la reflexión:Probablemente no haga eso en producción.
fuente
No existe un tipo genérico que le diga al compilador que un método no devuelve nada.
Creo que la convención es usar Object cuando se hereda como parámetro de tipo
O
Propague el parámetro de tipo y luego permita que los usuarios de su clase creen una instancia usando Object y asignen el objeto a una variable escrita usando un tipo de comodín
?
:fuente
A<?>
podrá hacer uso del valor devuelto demethod()
.