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