Что такое кастинг в java

Приведение типов объектов в Java

Обзор приведения типов в Java, покрытый простыми и понятными примерами.

1. Обзор

Система типов Java состоит из двух типов: примитивов и ссылок.

Дальнейшее чтение:

Основы дженериков Java

Оператор Java instanceof

2. Примитивный против Ссылка

В обоих случаях мы “превращаем” один тип в другой. Но, упрощенно говоря, примитивная переменная содержит свое значение, и преобразование примитивной переменной означает необратимые изменения ее значения:

Ссылочные переменные различны ; ссылочная переменная ссылается только на объект, но не содержит самого объекта.

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

Ссылка подобна дистанционному управлению объектом. Пульт дистанционного управления имеет больше или меньше кнопок в зависимости от его типа, а сам объект хранится в куче. Когда мы выполняем кастинг, мы меняем тип пульта дистанционного управления, но не меняем сам объект.

3. Апкастинг

Апкастинг тесно связан с наследованием – еще одной основной концепцией в Java. Обычно ссылочные переменные используются для ссылки на более конкретный тип. И каждый раз, когда мы это делаем, происходит скрытое повышение.

Чтобы продемонстрировать восходящее вещание, давайте определим класс Animal :

Теперь давайте расширим Животное :

Теперь мы можем создать объект класса Cat и назначить его ссылочной переменной типа Cat :

И мы также можем назначить его ссылочной переменной типа Animal :

В приведенном выше задании имеет место неявное повышение. Мы могли бы сделать это явно:

Но нет необходимости делать явное приведение дерева наследования. Компилятор знает, что cat является Животным и не отображает никаких ошибок.

Обратите внимание, что ссылка может ссылаться на любой подтип объявленного типа.

Хотя Cat объект остается Cat объектом, вызов meow() вызовет ошибку компилятора:

Но теперь мы опишем, что дает нам это предсказание. Благодаря апкастингу мы можем воспользоваться преимуществами полиморфизма.

3.1. Полиморфизм

Неявная передача происходит, когда мы добавляем объекты определенного типа в список animals :

Также распространена передача на интерфейс.

Мы можем создать Новый интерфейс и сделать Cat реализовать его:

Теперь любой объект Cat также может быть передан в Mew :

Это/| Кошка является Новым , Животным , Объектом и Кошкой . В нашем примере он может быть назначен ссылочным переменным всех четырех типов.

3.2. Переопределение

Если мы добавим некоторые записи в наши классы, мы увидим, что вызываются методы Cat ‘и Dog :

4. Даункастинг

Давайте возьмем пример:

Чтобы вызвать мяу() мы должны опустить животное к Кошке :

Внутренние скобки и тип, который они содержат, иногда называются оператором приведения. Обратите внимание, что внешние скобки также необходимы для компиляции кода.

Давайте перепишем предыдущий пример Animal Feeder с помощью метода meow() :

4.1. Оператор instanceof

Мы часто используем оператор instanceof перед понижением, чтобы проверить, принадлежит ли объект определенному типу:

4.2. Исключение ClassCastException

Чтобы продемонстрировать это, давайте удалим оператор instanceof из приведенного выше кода:

Этот код компилируется без проблем. Но если мы попытаемся запустить его, мы увидим исключение:

ява,ланг.ClassCastException: com.baeldung.casting.Собака не может быть брошена в com.baeldung.casting.Cat

ClassCastException’ s всегда выбрасывается во время выполнения, если тип, к которому мы относимся, не соответствует типу реального объекта.

Обратите внимание, что если мы попытаемся перейти к несвязанному типу, компилятор этого не допустит:

Компилятор говорит: “Не может привести от животного к строке”.

Для компиляции кода оба типа должны находиться в одном дереве наследования.

Давайте подведем итоги:

5. метод cast()

Есть еще один способ приведения объектов с помощью методов Class :

В приведенном выше примере вместо операторов cast и instanceof используются методы cast ( ) и isInstance () соответственно.

Обычно используются методы cast() и isInstance() с универсальными типами.

Давайте создадим AnimalFeederGeneric класс с feed() методом, который “кормит” только один тип животных – кошек или собак, в зависимости от значения параметра типа:

Давайте сделаем T равным Cat и убедимся, что метод возвращает только кошек:

6. Заключение

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

Источник

Объяснение ClassCastException в Java

Давайте подробнее рассмотрим исключение ClassCastException.

1. Обзор

Давайте рассмотрим некоторые сценарии, которые приводят к возникновению этого исключения, и как мы можем их избежать.

2. Явный Кастинг

Для наших следующих экспериментов рассмотрим следующие классы:

2.1. Классы литья

Безусловно, наиболее распространенный сценарий встречи с ClassCastException явно приводит к несовместимому типу.

Например, давайте попробуем бросить Лягушку в Млекопитающее :

Мы могли бы ожидать здесь ClassCastException , но на самом деле мы получаем ошибку компиляции: “несовместимые типы: Лягушка не может быть преобразована в млекопитающее”. Однако ситуация меняется, когда мы используем общий супертип:

Теперь мы получаем ClassCastException из второй строки:

Интересно отметить, что ошибка компиляции возникает только тогда, когда мы пытаемся привести к однозначно несовместимому классу. То же самое не относится к интерфейсам, поскольку Java поддерживает наследование нескольких интерфейсов, но только одно наследование для классов. Таким образом, компилятор не может определить, реализует ли ссылочный тип определенный интерфейс или нет. Давайте приведем пример:

Мы получаем ClassCastException во второй строке вместо ошибки компиляции:

2.2. Литейные массивы

Мы видели, как классы обрабатывают приведение, теперь давайте посмотрим на массивы. Приведение массива работает так же, как и приведение класса. Однако мы можем запутаться в автобоксах и продвижении типов или их отсутствии.

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

Вторая строка вызывает исключение ClassCastException as autoboxing не работает для массивов.

Как насчет продвижения по службе? Давайте попробуем следующее:

2.3. Безопасное литье

В случае явного приведения настоятельно рекомендуется проверить совместимость типов перед попыткой приведения с помощью instanceof .

Давайте рассмотрим пример безопасного приведения:

3. Загрязнение Кучи

В соответствии со спецификацией Java : ” Загрязнение кучи может произойти только в том случае, если программа выполнила какую-либо операцию с использованием необработанного типа, которая приведет к появлению непроверенного предупреждения во время компиляции”.

Для нашего эксперимента рассмотрим следующий универсальный класс:

Теперь мы попытаемся загрязнить кучу следующим образом:

4. Общие типы

Давайте рассмотрим следующий общий метод:

А теперь давайте назовем это:

5. Заключение

В этой статье мы рассмотрели ряд распространенных сценариев неподходящего кастинга.

Источник

Приведение типов объектов в Java

Приведение типов объектов в Java

1. обзор

Система типов Java состоит из двух типов типов: примитивы и ссылки.

Мы рассмотрели примитивные преобразования вthis article, и здесь мы сосредоточимся на приведении ссылок, чтобы получить хорошее представление о том, как Java обрабатывает типы.

Дальнейшее чтение:

Основы Java Generics

Краткое введение в основы Java Generics.

Java экземпляр оператора

Узнайте об операторе instanceof в Java

2. Примитив против Ссылка

Хотя примитивные преобразования и приведение ссылочных переменных могут выглядеть одинаково, они довольноdifferent concepts.

В обоих случаях мы «превращаем» один тип в другой. Но в упрощенном виде примитивная переменная содержит свое значение, а преобразование примитивной переменной означает необратимые изменения ее значения:

После преобразования в приведенном выше примере переменнаяmyInt равна1, и мы не можем восстановить из нее предыдущее значение1.1.

Reference variables are different; ссылочная переменная относится только к объекту, но не содержит самого объекта.

Приведение ссылочной переменной не затрагивает объект, к которому она относится, а только помечает этот объект другим способом, расширяя или сужая возможности для работы с ним. Upcasting narrows the list of methods and properties available to this object, and downcasting can extend it.с

Ссылка похожа на дистанционное управление объектом. Пульт дистанционного управления имеет больше или меньше кнопок в зависимости от его типа, а сам объект хранится в куче. Когда мы выполняем кастинг, мы меняем тип пульта дистанционного управления, но не меняем сам объект.

3. Апкастинг

Casting from a subclass to a superclass is called upcasting. Как правило, преобразование выполняется неявным образом.

Чтобы продемонстрировать апкастинг, давайте определим классAnimal:

Источник

Явные и неявные приведения типов в Java

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

Что такое приведение типов в Java?

Приведение типов в Java – это присвоение значения одного примитивного типа данных другому. Вы должны знать о совместимости этого типа данных. Если они совместимы, тогда Java выполнит преобразование, известное как автоматическое преобразование типов, а если нет, то их необходимо явно преобразовать.

В Java есть два типа приведения:

Неявное

Тип приведения, когда два типа данных автоматически конвертируются. Также известно как неявное преобразование. Происходит, когда два типа данных совместимы, а также когда мы присваиваем значение меньшего типа данных большему типу данных.

Например, числовые типы данных совместимы друг с другом, но автоматическое преобразование из числового типа в тип char или boolean не поддерживается.

Кроме того, char и boolean не совместимы друг с другом. Теперь давайте напишем логику для неявного приведения типов, чтобы понять, как это работает.

Явное

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

Давайте разберемся с этим на примере.

Явное приведение в выражениях

Когда вы вычисляете выражения, выходные данные автоматически обновляются до большего типа данных операнда. Но если вы сохраните этот результат в каком-либо меньшем типе данных, он генерирует ошибку времени компиляции, из-за которой нам нужно набрать приведение вывода.

Примечание: в случае одиночных операндов результат конвертируется в int, а затем соответственно преобразуется в тип.

Источник

В чем разница между up-casting и down-casting относительно переменной класса

в чем разница между up-casting и down-casting относительно переменной класса?

например, в следующем классе программы Animal содержит только один метод, но класс Dog содержит два метода, а затем мы приводим переменную Dog к переменной Animal.

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

9 ответов

Downcasting было бы что-то вроде этого:

однако, если вы должны были сделать это:

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

чтобы вызвать метод подкласса, вы должны сделать downcast. Как показано выше, вы обычно рискуете ClassCastException при этом, однако, вы можете использовать instanceof оператор для проверки типа выполнения объект перед выполнением броска, что позволяет предотвратить ClassCastException s:

Down-casting и up-casting было следующим образом:
Что такое кастинг в java. Смотреть фото Что такое кастинг в java. Смотреть картинку Что такое кастинг в java. Картинка про Что такое кастинг в java. Фото Что такое кастинг в java

Upcasting: когда мы хотим привести подкласс к супер классу, мы используем Upcasting (или расширение). Это происходит автоматически, не нужно ничего делать явно.

Downcasting: когда мы хотим привести супер класс к подклассу, мы используем Downcasting (или сужение), а Downcasting непосредственно невозможно в Java, явно мы должны это сделать.

Upcasting и downcasting являются важной частью Java, которая позволяет нам создавать сложные программы с использованием простого синтаксиса и дает нам большие преимущества, такие как полиморфизм или группирование различных объектов. Java разрешает объект типа подкласса рассматриваться как объект любого типа суперкласса. Это называется upcasting. Upcasting выполняется автоматически, в то время как downcasting должен выполняться вручную программистом, и я собираюсь дать все возможное, чтобы объяснить почему это так.

Upcasting и downcasting не похожи на кастинг примитивов от одного к другому, и я считаю, что это вызывает много путаницы, когда программист начинает изучать объекты кастинга.

полиморфизм: все методы в Java являются виртуальными по умолчанию. Это означает, что любой метод может быть переопределен при использовании в наследовании, если этот метод не объявлен как final или static.

вы можете увидеть пример ниже как!—6—> работы согласно типу предмета (собаки,любимчика,собаки полиции).

Предположим, у вас есть три собаки

полицейская собака-полицейская собака расширяет собаку.

полиморфизм : все методы в Java являются виртуальными по умолчанию. Это означает, что любой метод может быть переопределен при использовании в наследовании, если этот метод объявляется как final или static.(Объяснение относится к концепции виртуальных таблиц)

виртуальная таблица / таблица отправки: таблица отправки объекта будет содержать адреса динамически связанных методов объекта. Вызовы метода выполняются путем извлечения адреса метода из таблицы отправки объекта. Таблица отправки одинакова для всех объектов, принадлежащих к одному классу, и поэтому обычно используется совместно их.

Downcasting нужно сделать программистом вручную

при попытке вызвать secretID(); метод on obj3 что это PoliceDog object но ссылаться на Dog который является супер-классом в иерархии, он выдает ошибку, так как obj3 нет доступа к secretId() метод.In чтобы вызвать этот метод, вам нужно вручную понизить obj3 до PoliceDog

, который печатает ID

аналогичным образом вызвать dogName(); метод PetDog класс нужно опустить obj2 до PetDog поскольку obj2 ссылается на Dog и не имеют доступа к dogName(); метод

это причина, по которой вам нужно опустить объекты вручную если вы ссылались на свои объекты на тип супер класса.

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

Я знаю, что этот вопрос задан довольно давно, но для новых пользователей этого вопроса. Пожалуйста, прочитайте эту статью, где содержится полное описание по upcasting, downcasting и использованию instanceof оператор

нет необходимости поднимать вручную, это происходит само по себе:

Mammal m = (Mammal)new Cat(); равна Mammal m = new Cat();

но downcasting необходимо всегда делать вручную:

Почему это так, что upcasting является автоматическим, но downcasting должен быть ручным? Видите ли, апкастинг никогда не подводит. Но если у вас есть группа разных животных и вы хотите унизить их всех до кошки, то есть шанс, что некоторые из этих животных на самом деле собаки, и процесс терпит неудачу, бросая ClassCastException. Именно здесь следует ввести полезную функцию под названием «instanceof», который проверяет, является ли объект экземпляр некоторого класса.

для получения дополнительной информации, пожалуйста, прочитайте в этой статье

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *