Еще один аспект:
Java - это статический язык с довольно строгими возможностями. Это означает, что многие вещи, которые были бы достаточно открыты или динамичны в других языках (c / f Ruby, Lisp и т. Д.), Строго определены.
Это общее дизайнерское решение. На «почему» сложно ответить (ну, потому что разработчики языка думали, что это будет хорошо!). «Зачем» довольно ясно: он позволяет компилятору обнаруживать множество ошибок, что, как правило, довольно хорошая функция для любого языка. Во-вторых, это сравнительно легко рассуждать о языке. Например, относительно легко создать формальную корректность, доказывающую в (подмножествах) язык Java; для сравнения, это было бы практически невозможно в динамическом языке, таком как Ruby et al.
Это мышление пронизывает язык, например, принудительное объявление возможных исключений, которые может выдавать метод, отдельный тип interface
vs., class
чтобы избежать неоднозначного множественного наследования, и так далее. Для чего это (статический императивный язык ООП реального мира с упором на обработку ошибок во время компиляции) эти вещи на самом деле довольно элегантны и мощны. Они приближаются к теоретическим (научным) языкам, которые специально созданы для того, чтобы исследовать некоторые из этих вопросов, чем любой другой язык реального мира (в то время, учтите).
Так. Наличие строгого void
типа - ясное сообщение: этот метод ничего не возвращает, точка. Что есть, то есть. Замена его принудительным постоянным возвратом чего-либо привела бы к гораздо более динамичному поведению (как в Ruby, где каждое определение всегда имеет явное или неявное возвращаемое значение), что было бы плохо для доказуемости и рассуждений; или к огромному раздутию, используя какой-то другой механизм здесь.
(И NB, Ruby (например) обрабатывает это по-другому, и его решение все еще точно так же приемлемо, как и у Java, потому что у него совершенно иная философия. Например, оно полностью исключает доказуемость и разумность, одновременно уделяя большое внимание чрезвычайно высокая выразительность языка.)