2016-04-22 9 views
0

Ich habe das unten Stück Code:Typenkonflikt in Java?

public class AClass { 
    public AClass() { 
     System.out.println("Constructor A"); 
    } 
} 

public class BClass extends AClass{ 
    public BClass(){ 
     System.out.println("Constructor B"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     BClass b = new BClass(); 
    } 
} 

ich den Code geändert, wie unten zu sehen:

public class AClass { 
    public AClass() { 
     System.out.println("Constructor A"); 
    } 
} 

public class BClass extends AClass{ 
    public BClass(){ 
     System.out.println("Constructor B"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     BClass b = new AClass(); 
    } 
} 

Im zweiten Code-Schnipsel, ich bin BClass b = new AClass(); für diese Änderung eines Typenkonflikt Fehler.

Ich lerne Java und ich möchte die tiefere Bedeutung des Fehlers verstehen und ich möchte wissen, warum der Fehler im zweiten Codeausschnitt ?.

+2

'AClass' ist kein' BClass', also können Sie nicht so tun, als wäre es. Was sind deine Zweifel? –

+0

'BClass extends AClass' bewirkt, dass jedes' BClass'-Objekt auf einen gültigen 'AClass'-Objektverweis verweist, aber nicht umgekehrt. – pyon

+0

Möchten Sie 'AClass a = neue BClass();'? – Andrew

Antwort

7

Sag du sagst; ein Hund ist eine Art von Tier wie

class Animal { } 
class Dog extends Animal { 
    public void bark() { } 
} 
class Cat extends Animal { 
    public void meow() { } 
} 

Animal a = new Dog(); // is ok. 

Aber Sie können nicht sagen; Ein Tier ist eine Art Hund.

Dog d = new Animal(); // not ok. 
d.bark(); // Animal doesn't have a bark(); 
+2

Klassische Erklärung ... –

+1

@AnoopLL Sie würden denken, es gab ein Duplikat, aber ich konnte es nicht finden .... –

+2

Sie vergaßen die. Meow-Methode in der Klasse Cat: 3 – Onza

4

können Sie tun AClass b = new BClass(); aber nicht BClass b = new AClass(); weil einfach AClass ist Elternteil von BClass. Im Polymorphismus ist es nicht erlaubt.

0

Versuchen Sie stattdessen AClass a = new BClass();.

Die Liskov substitution principle sagt, dass

wenn S ein Subtyp von T ist, dann Objekte vom Typ T mit Objekten des Typs S ersetzt sein können

in Ihrem Beispiel, dass Objekte vom Typ bedeutet, A kann durch Objekte des Typs B ersetzt werden. Sie versuchen es andersherum. Was das Prinzip sagt, ist, dass, wenn Sie sagen, dass B ein Subtyp von A ist, Sie alle Fälle von B behandeln können, als wären sie A. Zum Beispiel können alle Hunde behandelt werden, als wären sie Säugetiere.

Was Ihr Beispiel versucht, ist ein Säugetier zu schaffen und es wie ein Hund zu behandeln.

0

Sie versuchen, downcasting durchzuführen. Um diesen Code zu ändern, ändern Sie einfach Ihren Code wie folgt:

public class AClass { 
    public AClass() { 
     System.out.println("Constructor A"); 
    } 
} 

public class BClass extends AClass{ 
    public BClass(){ 
     System.out.println("Constructor B"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     AClass b = new BClass(); 
     doDownCasting(b); 
    } 

private static void doDownCasting(AClass a){ 
    if(a instance of BClass){ 
    BClass bClass = (BClass)a; // do the downcasting here 
} 
} 

} 
Verwandte Themen