2009-03-24 12 views
109

Debido a la utilización de medicamentos genéricos en Java terminé en tener que implementar una función que tiene Void como tipo de retorno:¿Qué debo devolver si el tipo de devolución de un método es nulo? (No se anulará!)

demandas
public Void doSomething() { 
    //... 
} 

y el compilador que regreso algo. Por ahora sólo estoy volviendo null, pero me pregunto si eso es una buena práctica de codificación ...

También he intentado Void.class, void, Void.TYPE, new Void(), sin retorno en absoluto, pero todo lo que doesn' t trabajo en absoluto. (Por razones más o menos obvias) (Ver this answer para más detalles)

  • Entonces, ¿qué se supone que voy a volver si el tipo de retorno de una función es Void?
  • ¿Cuál es el uso general de la clase Void?

EDIT: Sólo de sobra que los downvotes: Estoy preguntando V OID, no v OID. La clase Void, no la palabra clave reservada void.

Respuesta

98

Entonces, ¿qué se supone que debo devolver si el tipo de devolución de una función tiene que ser Void?

Use return null. Void no se puede crear una instancia y es simplemente un marcador de posición para el tipo Class<T> de void.

¿Cuál es el punto de Void?

Como se señaló anteriormente, es un marcador de posición. Void es lo que obtendrás si, por ejemplo, usas la reflexión para ver un método con un tipo de devolución de void. (Técnicamente, obtendrá Class<Void>.) Tiene otros usos variados en estas líneas, como si desea parametrizar un Callable<T>.

Debido al uso de los genéricos en Java terminé en tener que implementar esta función

yo diría que algo puede estar funky con su API si necesita implementar un método con este firma. Considere cuidadosamente si hay una mejor manera de hacer lo que desea (¿quizás puede proporcionar más detalles en una pregunta de seguimiento diferente?).Soy un poco sospechoso, ya que esto solo surgió "debido al uso de genéricos".

+11

Tener que devolver Void no es tan funky después de todo. Simplemente puede ser obligatorio por ej. Llamable . A veces, simplemente no necesita devolver algo, pero no puede usar, p. Runnable. – Bombe

+0

Void tiene usos legítimos, como noté. Pero dijo que "esto solo surgió debido al uso de genéricos". Eso hace que parezca que hizo algo en una colección que necesita usar Void, lo que diría es un caso bastante excepcional. –

+0

Con colecciones sería muy extraño, de hecho. – Bombe

18

return null es el camino a seguir.

0

Si, por razones oscuras, DEBE usar este tipo, entonces, de hecho, devolver nulo parece ser una opción sensata, ya que supongo que el valor de retorno no se utilizará de todos modos.
El compilador le obligará a devolver algo de todos modos.
Y esta clase no parece tener un constructor público, por lo que no es posible el nuevo Void().

+0

No seré un DEBER; es solo una convención. –

23

No hay forma de crear una instancia de un Void, por lo que lo único que puede devolver es nulo.

+13

Más exactamente, no hay forma de instanciar un Vacío sin hacer cosas malvadas. –

17

dejar claro por qué las otras sugerencias que diste no funcionan:

Void.classVoid.TYPE y apuntan al mismo objeto y son de tipo Class<Void>, no de Void.

Es por eso que no puede devolver esos valores. new Void() sería del tipo Void pero ese constructor no existe. De hecho, Void no tiene constructores públicos y, por lo tanto, no se puede crear una instancia: nunca se puede tener ningún objeto del tipo Void, excepto el polimórfico null.

Espero que esto ayude! :-)

+0

Corrección secundaria: 'Void.TYPE' no apunta a' Void.class'. Apunta a 'void.class'. – shmosel

Cuestiones relacionadas