Почему мне нужно выполнить приведение к определенной ссылке в массиве объектов? - PullRequest
0 голосов
/ 03 апреля 2019

Чтобы сослаться на конкретный объект внутри массива, мне нужно привести int к его типу, или компилятор не принимает, зачем мне это приведение?

Exemple:

Person[] people = Person[5];            //Generic Array of specific objects

Employee employee1 = new Employee();    //Employee class extends Person
Manager manager1 = new Manager();       //Manager class extends Person

people[0] = employee1;
people[1] = manager1;


Person ref = people[0];                //OK! it can compile
Employee ref2 = people[1];               //Do not compile
Employee ref2 = (Employee) people[1];      //OK! it can compile

Зачем нужен актерский состав?

Ответы [ 4 ]

2 голосов
/ 03 апреля 2019

В Java существует понятие upcasting и downcasting. Повышение рейтинга означает приведение к супертипу, тогда как снижение рейтинга означает приведение к подтипу.

Всякий раз, когда есть Is-A отношения, вы можете делать апкастинг без какого-либо вреда. Но это уныние, о котором нужно позаботиться.

Например, у вас есть People array и так как Employee и Manager классы extends People, поэтому в массиве People могут храниться оба из них. Теперь, когда вы делаете Employee ref2 = people[1];, компилятор не знает, является ли он сотрудником, поскольку существует равная вероятность того, что он может быть Manager, поскольку класс Manager также расширяет People. Таким образом, вам нужно явно предоставить приведение, которое сообщает компилятору, что вы знаете, что делаете, и нет необходимости выдавать ошибку компиляции. Но если во время выполнения возникнет какая-либо проблема, будет выдан ClassCastException.

1 голос
/ 03 апреля 2019

Тип переменной people равен Person.Person[] people = Person[5]; (type[] people = new instance - экземпляр также может быть дочерним, который расширяет type).

Здесь Employee ref2 = people[1]; компилятор видит people как Person, и вы должны сказать, что в компиляторе это также может бытьEmployee (причина Employee расширяет Person) путем приведения.

Подробнее об этом можно прочитать здесь: https://www.baeldung.com/java-type-casting

1 голос
/ 03 апреля 2019

Он не скомпилирован без приведения, поскольку people[1] не известен компилятору как Employee.

Из Учебник по Java. Casting Objects :

Мы можем сообщить компилятору, который мы обещаем назначить Employee для people[1] с помощью явного приведения.

Это приведение вставляет проверку во время выполнения, что people[1] назначено Employee, так что компилятор может с уверенностью предположить, что people[1] является Employee.Если people[1] не является Employee во время выполнения, будет сгенерировано исключение.

Подробнее Приведение переменных в Java

0 голосов
/ 03 апреля 2019

Поскольку у вас есть Сотрудник ссылка и вы пытаетесь создать его экземпляр со значением типа Person .

Сотрудник - это Человек , но Человек не обязательно Сотрудник . Поправь меня, если я ошибаюсь.

...