2016-04-03 8 views
-1

У меня есть основной вопрос в java. из моих исследований я обнаружил, что понижающее приведение не допускается в Java, поскольку он вызывает исключение во время выполнения, но в некоторых ограниченных случаях, такие как Downcasting in Java, когда в java возможно опускание?

Но я не могу понять, почему это утверждение исходит HttpURLConnection соединения = URL (HttpURLConnection) .openConnection() без проблем?

(потому что openConnection() возвращает URLConnection объект)

быть специфическими

Я извиняюсь за плохой английский язык, потому что я не являюсь носителем языка

+0

спасибо yassin; но при каких обстоятельствах он возвращает true или false –

+0

Я закрыл ваш вопрос как дубликат точного, который вы упомянули, потому что ответ буквально является первой строкой в ​​первом ответе: «* Downcasting разрешен, когда есть вероятность, что он преуспеет в время выполнения * ". Сравните это с вашим утверждением «* downcasting не разрешен в java, потому что он генерирует исключение во время выполнения *», и это кажется простой ошибкой в ​​интерпретации. –

+0

@JeroenVannevel, если это так, почему иногда downcasting бросает classcastexception? –

ответ

0

Поскольку объект вернулся из url.openConnection в обстоятельства, которые здесь используются : a HttpUrlConnection и программист нуждается в доступе к своим методам, но он был возвращен как интерфейс, поэтому javac не знает, что это что-то еще, кроме интерфейса.

Иными словами, программист разбивает дизайн инкапсуляции в API, чтобы получить доступ к функциям, скрытым API.

+0

спасибо. можете ли вы дать некоторый сценарий [рекомендации], когда у java проблемы с downcasting, а когда нет? –

+0

Вы должны понимать роль _interfaces_ в Java. Пример: интерфейс может быть «автомобилем». Тогда у вас могут быть два класса «BMW» и «VW», каждый из которых является автомобилем. BMW - это не виртуальная машина, а VW - не BMW. Если у вас есть заявление типа «Автомобиль car = getCar()», он не может вернуть _just_ a Car (потому что это интерфейс), но _must_ возвращает BMW или VW (или что-то еще, что у вас есть). Downcasting означает «отныне лечить как». Вы не можете относиться к VW как к BMW. –

0

URL.openConnection() возвращает URLConnection, который является abstract class, т.е. возвращаемый объект никогда не может быть действительно типа URLConnection, но должны быть класса, который наследует от URLConnection, такой как HttpURLConnection.

Как принятый ответ на Stackoverflow нить вы связаны говорит,

понижающее приведение допускается, когда есть вероятность того, что она преуспевает во время выполнения:

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

+0

Если возвращаемый класс не был HttpUrlConnection (которого нет гарантии), будет выбрано исключение. –