programming method array java void return-type

java - method - ¿Por qué no puedo devolver explícitamente el vacío de un método?



return string java (14)

Respuesta corta

La return cancel() debe devolver un valor válido, pero la declaración de método void run() declara que run() no devuelve un valor; por lo tanto, return cancel() en run() es un error. La declaración de return (sin una expresión) intenta transferir el control a la persona que llama y se utiliza cuando el tipo de devolución del método es void ; por lo tanto, no es un error.

Respuesta larga

La sección The *return* Statement JLS The *return* Statement declara:

Una declaración de devolución sin expresión intenta transferir el control al invocador del método o constructor que lo contiene. [...] Una declaración de devolución con una expresión debe estar contenida en una declaración de método que se declara para devolver un valor (§8.4) o se produce un error en tiempo de compilación. La expresión debe denotar una variable o valor de algún tipo T, o se produce un error en tiempo de compilación. El tipo T debe ser asignable (§5.2) al tipo de resultado declarado del método, o se produce un error en tiempo de compilación.

La sección Method Return Type JLS indica:

El tipo de devolución de un método declara el tipo de valor que devuelve un método, si devuelve un valor, o indica que el método es nulo. Una declaración de método d1 con retorno tipo R1 es reemplazable por tipo de retorno para otro método d2 con retorno tipo R2, si y solo si se cumplen las siguientes condiciones: [...] * Si R1 es nulo, R2 es nulo.

El capítulo de Types, Values, and Variables JLS, primer párrafo, declara:

El lenguaje de programación Java es un lenguaje fuertemente tipado, lo que significa que cada variable y cada expresión tiene un tipo que se conoce en tiempo de compilación. Los tipos limitan los valores que una variable (§4.12) puede contener o que una expresión puede producir, limita las operaciones soportadas en esos valores y determina el significado de las operaciones.

La sección JLS The Kinds of Types and Values establece:

Hay dos tipos de tipos en el lenguaje de programación Java: tipos primitivos (§4.2) y tipos de referencia (§4.3). Existen, en consecuencia, dos tipos de valores de datos que pueden almacenarse en variables, pasarse como argumentos, regresar por métodos y operar en: valores primitivos (§4.2) y valores de referencia (§4.3).

Solo unas pocas citas más ahora. La sección Expression Statements JLS indica:

A diferencia de C y C ++, el lenguaje de programación de Java permite que solo ciertas formas de expresiones se utilicen como declaraciones de expresión. Tenga en cuenta que el lenguaje de programación Java no permite que un "lanzamiento se anule" -vocar no es un tipo

La sección del Method Body JLS indica:

Si un método se declara vacío, su cuerpo no debe contener ninguna declaración de devolución (§14.17) que tenga una Expresión.

Y, finalmente, la sección Method Declarations JLS indica:

Una declaración de método especifica el tipo de valor que devuelve el método o utiliza la palabra clave void para indicar que el método no devuelve un valor.

Ahora, cuando compilamos todos juntos, podemos deducir lo siguiente:

  • Si una declaración de return contiene una expresión, la expresión debe evaluar a un valor válido.
  • Un valor de expresión de return válido debe ser un tipo primitivo o un tipo de referencia.
  • void no es un tipo de valor válido.
  • Un método declarado con un tipo de retorno void , no devuelve ningún valor.
  • Método void run() no devuelve un valor.
  • En run() , return , sin una expresión, transferirá felizmente el control a la persona que llama.
  • En run() , return some expression es un error porque some expression debe ser un valor válido y run() no devuelve un valor.

void run() { ... if (done) return cancel(); ... }

donde cancel() return void . Esto no compilará ... y casi puedo entender por qué. Pero si quiero devolver un vacío de un vacío, ¿por qué no? En cambio, termino escribiendo algo como esto:

if (done) { cancel(); return; }

No estoy buscando sugerencias de estilo de código, quiero saber por qué Java prohíbe expresamente este tipo de devolución de nulo. Cualquier información es apreciada, gracias.


Desde el JLS:

Una declaración de devolución sin expresión debe estar contenida en el cuerpo de un método que se declara, utilizando la palabra clave void, no para devolver ningún valor, o en el cuerpo de un constructor

...

Una declaración de devolución con una expresión debe estar contenida en una declaración de método que se declara para devolver un valor o se produce un error en tiempo de compilación. La expresión debe denotar una variable o valor de algún tipo T, o se produce un error en tiempo de compilación. El tipo T debe ser asignable al tipo de resultado declarado del método, o se produce un error en tiempo de compilación.


Es como escribir:

void v=(void)1; return (v);

Entonces, creo que el void no es un type en Java.

En C ++, return cancel(); es legal.

Como programador de C ++ familiarizado con Java, la respuesta es: muchas cosas no son compatibles con la sintaxis de Java. Tal vez por simplicidad o legibilidad.

Nota: Una declaración void f() es similar a una declaración de procedure f() en pascal y un procedimiento no podría devolver ningún valor como funciones, por lo que debemos llamarlos en una declaración separada.


Es una pregunta interesante. Como java impone un tipo de devolución (el void es un tipo de devolución), su primera afirmación parece tener sentido. Tomaría esto solo por convención. Como el void es un marcador de posición y no un objeto, probablemente se decidió dejarlo fuera de la coherencia del lenguaje o la simplicidad del compilador.

De JLS

Una declaración de devolución sin expresión debe estar contenida en el cuerpo de un método que se declara, utilizando la palabra clave void, no para devolver ningún valor (§8.4), o en el cuerpo de un constructor (§8.8).

promover

Para ser precisos, una declaración de devolución sin expresión siempre se completa abruptamente, siendo la razón una devolución sin valor


Es una tautología. Es decir, void define que el método no tiene valor de retorno. Por lo tanto, ¿cómo puede "volverse vacío" cuando el vacío no tiene retorno?


Idea interesante. El problema principal es la especificación de idioma, que define una declaración de devolución como compuesta de return <expression> . Un método de vacío no es una expresión, por lo que la construcción no está permitida.

Descubrió que puede replicar la funcionalidad ejecutando el método void y luego regresando, por lo que no hay una razón real para permitirlo.


La gramática de Java en realidad no se preocupa por el tipo de una llamada a método, por lo que ese no es el problema. Tiene que ser algo más abajo en la cadena, en el sistema de verificación de tipos. Creo que la conclusión es que si se incluye una declaración gramaticalmente opcional después de la palabra clave return, entonces el sistema espera que se transmita un valor. void ciertamente es un tipo, pero no hay valores con tipo void .

Pero, por supuesto, nada de esto explica realmente la respuesta a su pregunta. Como usted señaló, no hay ninguna razón por la cual este modismo no deba permitirse. Pero tampoco hay una razón válida para permitirlo. Entonces es una sacudida. Uno podría tratar de racionalizar por qué hicieron lo que hicieron, pero eso probablemente sería inútil.


Porque no vuelves void . void no es un valor, por lo que no se puede devolver.


Una forma adecuada de manejar esto sería:

void run() { ... if (done) { cancel(); return; } ... }


Una instrucción return con una expresión devuelve el valor de esa expresión. El tipo de cancel() es una expresión vacía, no tiene un valor.

Lógicamente, desea ejecutar cancel() y luego regresar, así que eso es lo que tiene que decir. Las dos acciones (llamar a cancel() y luego regresar) son lógicamente distintas.

Ahora Java podría tener una especie de tipo "unidad" en lugar de void , pero eso afectaría algo más que solo devolver valores.


Void no es un tipo real. Void es solo un marcador de posición para hacer que la sintaxis de la definición de métodos sea más consistente. Esta no es la innovación de Java; esto es heredado de C.

Esta es la razón por la cual el compilador no le permite escribir return cancel() incluso si el método cancel() es void .


return x explícitamente significa "return the value x", independientemente de qué tipo sea (el tipo, por supuesto, aún tiene que coincidir con el tipo de retorno de cualquier función en la que se coloque la declaración).

void es, estrictamente hablando, la ausencia de un tipo, y por extensión, la ausencia de un valor, por lo que no tiene sentido devolver uno, al igual que no tiene sentido (y no está permitido) declarar una variable void .


void no es un tipo. void en la definición de método es solo un marcador de posición para nada.


void no es un tipo. Sin embargo, si usa el tipo Void lugar de la palabra clave void , su código funcionará, pero: Deberá return null manualmente en todos los puntos de salida de su método.