Зачем бросать в Closeable первым? - PullRequest
3 голосов
/ 21 июля 2010

Читая какой-то источник Java, я наткнулся на эту строку:

((Closeable) some_obj).close();

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

some_obj.close();

Ответы [ 3 ]

7 голосов
/ 21 июля 2010

Если предположить, что тип времени компиляции some_obj реализует Closeable, тогда да, вы могли бы.

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

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

3 голосов
/ 21 июля 2010

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

2 голосов
/ 21 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...