Краткий ответ
Оператор return cancel()
должен возвращать допустимое значение, но объявление метода void run()
объявляет, что run()
не возвращает значение; следовательно, return cancel()
в run()
является ошибкой. Оператор return
(без выражения) пытается передать управление вызывающему объекту и используется, когда тип возвращаемого значения метода равен void
; следовательно, не ошибка.
Длинный ответ
JLS The *return* Statement
указано:
Оператор return без выражения пытается передать управление инициатору метода или конструктора, который его содержит. [...] Оператор возврата с выражением должен содержаться в объявлении метода, который объявлен для возврата значения (§8.4), иначе возникает ошибка времени компиляции. Выражение должно обозначать переменную или значение некоторого типа T, иначе произойдет ошибка времени компиляции. Тип T должен быть присваиваемым (§5.2) объявленному типу результата метода, иначе возникает ошибка времени компиляции.
В разделе Method Return Type
JLS указано:
Тип возвращаемого значения метода объявляет тип значения, которое возвращает метод, если он возвращает значение, или указывает, что метод недействителен. Объявление метода d1 с типом возвращаемого значения R1 является замещаемым по типу возвращаемого значения другим методом d2 с типом возвращаемого значения R2 тогда и только тогда, когда выполняются следующие условия: [...] * Если R1 недействителен, то R2 недействителен.
JLS Types, Values, and Variables
глава, первый абзац гласит:
Язык программирования Java является строго типизированным языком, что означает, что каждая переменная и каждое выражение имеют тип, который известен во время компиляции. Типы ограничивают значения, которые может содержать переменная (§4.12) или которые может создавать выражение, ограничивают операции, поддерживаемые этими значениями, и определяют значение операций.
В разделе The Kinds of Types and Values
JLS указано:
В языке программирования Java существует два вида типов: примитивные типы (§4.2) и ссылочные типы (§4.3). Соответственно, существует два типа значений данных, которые могут храниться в переменных, передаваться в качестве аргументов, возвращаться методами и обрабатываться: примитивные значения (§4.2) и ссылочные значения (§4.3).
Теперь еще несколько цитат. В разделе Expression Statements
JLS указано:
В отличие от C и C++, язык программирования Java позволяет использовать в качестве операторов выражений только определенные формы выражений. Обратите внимание, что язык программирования Java не допускает «приведения к пустоте» — void не является типом
В разделе Method Body
JLS указано:
Если метод объявлен недействительным, то его тело не должно содержать оператора возврата (§14.17), содержащего выражение.
И, наконец, в разделе JLS Method Declarations
говорится :
Объявление метода либо указывает тип значения, которое возвращает метод, либо использует ключевое слово void, чтобы указать, что метод не возвращает значение.
Теперь, когда мы собираем все это вместе, мы можем сделать следующий вывод:
- Если оператор
return
содержит выражение, выражение должно оцениваться как допустимое значение.
- Допустимое значение выражения
return
должно быть примитивным или ссылочным типом.
void
не является допустимым типом значения.
- Метод, объявленный с типом возвращаемого значения
void
, не возвращает значения.
- Метод
void run()
не возвращает значение.
- В
run()
return
без выражения с радостью передаст управление вызывающей стороне.
- В
run()
return some expression
является ошибкой, поскольку some expression
должно быть допустимым значением, а run()
не возвращает значение.
person
Dan Cruz
schedule
18.10.2011