2017-10-23 7 views
0

이 코드를 실행할 때 런타임 오류가 발생하는 이유는 무엇입니까? 배열은 과일을 보유하도록 정의되어 있지만 사과로 초기화 한 후에 과일에 줄 수없는 방법은 무엇입니까?Java Thinking에서 런타임 업 캐스팅 실패

class Fruit{} 
class Apple extends Fruit{} 
class Jonathan extends Apple{} 
class Orange extends Fruit{} 

public class CovariantArrays { 
    public static void main(String[] args) { 
     Fruit[] fruit = new Apple[10]; 
     fruit[0] = new Apple(); 
     fruit[1] = new Jonathan(); 
     try { 
      fruit[0] = new Fruit(); 
     } catch(Exception e) { System.out.println(e); } 
     try { 
      fruit[0] = new Orange(); 
     } catch(Exception e) { System.out.println(e); } 
    } 
} 
+2

배열은'Apple []'입니다. 왜 애플이 일종의 '애플'이 아니 겠는가? –

답변

-1

봅니다 배열 유형에 넣어하기 :

fruit[0] = (Fruit) new Apple(); 
0

이유는 왜 당신은 Apple 내부 FruitOrange을 넣어하려고되기 때문이다. Apple[] 안에 사과를 넣는 것만 가능합니다.

class Fruit{} 
class Apple extends Fruit{} 
class Jonathan extends Apple{} 
class Orange extends Fruit{} 
class BigApple extends Apple{} 
class BigGreenApple extends BigApple{} 

public class CovariantArrays { 
    public static void main(String[] args) { 
     Fruit[] fruit = new Apple[10]; 
     fruit[0] = new Apple(); 
     fruit[1] = new Jonathan(); // no error here since Jonathan is an Apple 
     fruit[2] = new BigApple(); // still Apple 
     fruit[3] = new BigGreenApple(); // no worries - still Apple 
     fruit[4] = new Orange(); // Oops - Orange is a Fruit but its not Apple so error here 
    } 
}