2010-07-21 3 views
3

При чтении какой-то источник Java, я наткнулся на эту строку:Зачем бросать в Closeable в первую очередь?

((Closeable) some_obj).close(); 

some_obj, очевидно, является экземпляром класса, который реализует интерфейс закрывающиеся. Мой вопрос: почему они сначала бросают some_obj в Closeable перед вызовом close(). Не могу я просто

some_obj.close(); 

ответ

7

Предполагая время компиляции типа some_obj орудий Closeable, то да, вы могли бы.

Вы должны были бы это, только если у вас объект, который вы знал реализованный Closeable, но где тип времени компиляции было нечто более общее (наиболее очевидным примером является Object) или иным образом «разные» (например, другой интерфейс).

Как раз в интересующий момент, в C# приведение к типу интерфейса может иметь значение, даже если известно, что тип времени компиляции реализует интерфейс из-за явной реализации интерфейса. Я могу дать более подробную информацию, если кто-то заботится, но я просто подумал, что выброшу его.

+0

технически, это может быть не что-то «более общее», просто что-то «другое» (родственный тип для Closeable). –

+0

технически, технически, он может быть не связан с Closeable вообще (в версии без литья) ;-) – 2010-07-21 08:35:54

3

Если известно во время компиляции типа переменной some_obj содержит метод close(), то да.

2

Звучит так, как будто это не нужно. (Вы можете подтвердить это, пытаясь скомпилировать класс с удаленным предположительным избыточным типом.)

Возможно, мы никогда не знаем, почему код был написан таким образом. Это может быть оставлено после предыдущего воплощения кода, где объявленный тип some_obj был другим. Возможно, разработчик имел некоторые стилистические проблемы ...

Хотя это могло бы (вероятно) улучшить читаемость кода, если избыточный отбор был удален, на самом деле он не наносит никакого вреда. Я ожидаю, что компилятор Java или компилятор JIT оптимизируют его. И даже если это не так, стоимость избыточного типа, скорее всего, невелика.

Смежные вопросы