type-casting, wenn Objekte des interface-Referenzen in Java

Ich bin vertraut mit type casting im inheritance model.

Lassen SuperClass and SubClass werden Eltern-und Kind-Klassen;

SuperClass superClass = new SubClass(); -- Hier die object instanziiert ist ein subclass object;
aber seine reference type ist SuperClass; das ist nur die methods von SuperClass genannt werden kann, auf die subclass object; Jede methods sind nicht inherited/overridden im subclass kann nicht aufgerufen werden (das ist eine beliebige, eindeutige methods von subclass).

Beobachtete ich dasselbe Verhalten wie oben, wenn SuperClass is an interface und SubClass implements it. Das ist nur die Methoden deklariert, die in SuperClass interface verfügbar sind, genannt zu werden, auf die SubClass Objekt. Ist mein Verständnis richtig? Aber mit einigen casting kann ich nennen methods ist nicht Teil der Schnittstelle, die ich beobachtet habe, in meinem Beispiel-code unten;

Habe ich einige Kommentare auf meinem Verständnis, wie es funktioniert;
aber ich würde gerne wissen ob die Sinn machen oder, wenn meine interpretation falsch ist;

class Animals {

     public void bark(){
         System.out.println("animal is barking");
     }

}

 interface catIF {
     public void catting();

 }

interface dogIF {
    public void dogging();
 }

class Dog extends Animals implements dogIF {

    public void bark(){
        System.out.println("dog is barking");
    }


    public void dogging() {
        System.out.println("dogging");

    }

}

class Cat extends Animals implements catIF {

    public void bark(){
        System.out.println("cat is barking");
    }


    public void catting() {
        System.out.println("catting");

    }

}

public class Animal {

    public static void main(String[] args){
        dogIF dog = new Dog();
        //dog.bark(); this fails
        //This method actually actually exists;
        //but it is not available or hidden because dogIF reference
        //limits its availability; (this is similar to inheritance)

        Dog dog2 = new Dog();
        dog2.bark();
        ////prints dog is barking

        Animals an =(Animals) dog;
        an.bark();
        //prints dog is barking
        //by casting we mean, treat the dog as an animals reference
        //but the object itself is a dog.
        //call the bark() method of dog
        //but dog did not have this method in the beginning (see first line
        //in main - when instantiated with interface type)
        }
     }
  • dogIF#bark() nicht vorhanden, so sind Sie Recht haben. Methodenaufrufe sind entschlossen, zur compile-Zeit, basierend auf der deklarierte Typ der Referenz.
  • Ja Ihr verstehen, ist das völlig in Ordnung.
  • Vererbung, ob die Schnittstellen ist ein wenig flockig in Java -- ich bin nicht sicher, ob jemand wirklich versteht. (Verstanden hab ich es lange genug, um zu implementieren checkcast, aber die Regeln sind also Arkan hab ich längst vergessen.)
  • Aber eine Sache zu verstehen ist, dass wenn du einen expliziten cast ((Animals), z.B.), dann wird der compiler nimmt Ihr Wort für es, dass das Objekt in Frage ist der Typ angegeben. Unter der Decke ein checkcast bytecode versichert, dass das, was Sie sagen, wahr ist, aber der compiler hat keine Ahnung, ob die checkcast Erfolg haben oder scheitern.
  • eine Art von expliziten cast compiler fängt ihn auf. aber einige throws classcastexception-Fehler in run-time...ich denke, der Grund, warum diese explizite cast gefangen sind in compile-Zeit ist, denn diese wirft nie passieren kann. so etwas wie Cat cat = (Dog) dog; im obigen Beispiel; Obwohl beide erstreckt sich von Animals
  • Wirft überprüfen, ob das Objekt implementiert die neue Art, bevor Sie wirksam werden, und werfen einen ClassCastException wenn es nicht. Also, entweder Cat oder Dog erweitert/implementiert Animals und umgewandelt werden kann Animals, aber Sie haben nicht die super - /Unterklasse-Beziehung zu einander, so können Sie nicht wirken einem zum anderen. Obwohl Sie haben könnte, ein Objekt, das erweiterte Cat und umgesetzt dogIF, wenn Sie wollte beschreiben, wie eine Katze, teilte das letztere Verhalten mit Hunden... wie bei mir, die manchmal einen ball Holen.
  • Explizite Typumwandlungen sind nicht "gefangen" werden zur compile-Zeit. Was diagnostiziert beim kompilieren wird eine inkompatible Zuordnung. Cat cat = (Dog) dog ist nicht mehr unwirksam, die für den compiler, als Cat Cat = (Hund) anotherCat. What the compiler diagnoses is the attempt to assign something declared (by the cast) to be Dog to a Cat variable. (The compiler would be perfectly happy with Katze Katze = (Katze) Hund`.)

InformationsquelleAutor brain storm | 2014-02-04
Schreibe einen Kommentar