Ще один аспект:
Java - статична мова з досить суворими можливостями. Це означає, що багато речей, які були б цілком відкритими або динамічними іншими мовами (c / f Ruby, Lisp тощо), суворо визначені.
Це загальне дизайнерське рішення. На "чому" важко відповісти (ну, адже дизайнери мови вважали, що це буде добре!). "Що для" досить зрозуміло: він дозволяє компілятору виявити безліч помилок, що, як правило, є досить хорошою особливістю для будь-якої мови. По-друге, досить легко міркувати про мову. Наприклад, відносно легко створити формальну коректність, що підтверджується (підмножинами) мови Java; для порівняння, це було б практично неможливо в такій динамічній мові, як Ruby et al.
Це мислення пронизує мову, наприклад, вимушене заяву про можливі винятки , що метод може кинути, окремий тип interface
VS. , class
щоб уникнути неоднозначного множинного спадкоємства, і так далі. Оскільки це (статична імперативна мова реального світу OOP з сильним упором на обробку помилок у часі компіляції), ці речі насправді є досить елегантними та потужними. Вони наближаються до теоретичних (наукових) мов, які цілеспрямовано створені лише для того, щоб вивчити деякі з цих питань, ніж будь-яка інша мова в реальному світі (на той час, пам'ятайте).
Тому. Суворий void
тип - це чітке повідомлення: цей метод нічого не повертає, періоду. Це те, що воно є. Заміна цього примусу завжди повертати щось призведе до або набагато більш динамічної поведінки (як, наприклад, у Ruby, де кожен def завжди має явне або неявне повернення), що було б погано для доказів та міркувань; або до масового набряку, використовуючи тут якийсь інший механізм.
(І NB: Рубі (наприклад) вирішує це по-різному, і його рішення все ще настільки ж прийнятне, як і у Java, тому що має абсолютно іншу філософію. Наприклад, він викидає провісність і розумність повністю у вікно, роблячи велику увагу на надзвичайно висока виразність мови.)