2017-10-23 4 views
0

Warum sollte bei der Ausführung dieses Codes ein Laufzeitfehler auftreten? Das Array ist so definiert, dass es Früchte enthält, aber wie kann ich es nicht fruchtbar machen, nachdem ich es mit Apfel initialisiert habe?Runtime-Upcasting-Fehler von Thinking in Java

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

Das Array ist ein 'Apple []'. Warum würdest du erwarten, dass es in der Lage ist, etwas zu halten, das keine Art von "Apple" ist? –

Antwort

-1

Versuchen Sie es in Array-Typ zu setzen:

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

Der Grund dafür ist, weil Sie versuchen, eine Fruit und Orange innerhalb eines Apple zu setzen. Sie können Sachen nur innerhalb Apple[] setzen, wenn es wirklich ein Apfel ist, z.

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 
    } 
} 
Verwandte Themen