0

Задача из подпункта по приведению типов объектов:

//What is wrong in the following code?

public class Test {
  public static void main(String[] args) {
    Object fruit = new Fruit();
    Object apple = (Apple)fruit;
  }
}

class Apple extends Fruit {
}

class Fruit {
}

Что тут не так?

12
  • @panzermarin, почему мы явно не можем считать любую машину за жигули?
    – etki
    5 мар 2015 в 11:37
  • Но именно эта машина есть жигули, и поэтому объект класса Автомобиль явно приводим к классу Жигули. Что хочет услышать автор книги в ответ на этот вопрос?
    – bhjnbnnn
    5 мар 2015 в 11:40
  • @panzermarin, нет, у этой машины вообще нет марки.
    – etki
    5 мар 2015 в 11:41
  • 3
    @panzermarin !Imgur
    – etki
    5 мар 2015 в 13:29
  • 1
    @panzermarin: Должен упасть. Т. к. fruit имеет runtime-тип Fruit, но не является Apple.
    – VladD
    5 мар 2015 в 13:37

1 ответ 1

4

Каждое яблоко - фрукт, но не каждый фрукт - яблоко. Мы можем работать с яблоком, как с фруктом, но не можем привести фрукт к яблоку.

4
  • Почему не можем? Это называется "Explicit casting"
    – bhjnbnnn
    5 мар 2015 в 11:52
  • @panzermarin потому что фруктом может быть апельсин, например. Вот достаете вы из черной коробки фрукт и говорите: "Ооо щас яблоко сожру", т.е. заранее думаете, что это яблоко, хотя не знаете наверняка, какой фрукт вытащите. И вот если вы вытащите не яблоко, но назовете это яблоком - это будет ошибкой.
    – Deadkenny
    5 мар 2015 в 12:07
  • @panzermarin, потому что если фрукт окажется не яблоком, вы словите ClassCastException.
    – Nofate
    5 мар 2015 в 13:35
  • Оооо, спасибо. Теперь понял!
    – bhjnbnnn
    5 мар 2015 в 13:37

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.