Ich arbeite mit einer API in meiner Firma, wo ich eine Unterklasse für ein vorhandenes Objekt erstellen möchte. Hier sind die Einsprüche:So werfen Sie ein Objekt in Java
- ich nicht den übergeordneten Klasse
- ändern kann ich nicht ändern kann, wie das Super Objekt instanziiert wird
Das Beispiel sehe ich am häufigsten einen Hund als Unterklasse von Tiere ist, so Ich werde das benutzen. Sagen wir, Sie in der API dieser Klasse haben:
//API class, which I cannot modify
public class Animal(){
public void eat(){
//All animals can do this
}
}
Nun würde Ich mag eine Klasse wie folgt zu schaffen, die ein paar Methoden zu Tierhinzufügt.
//My subclass, which I can modify
public class Dog extends Animal(){
public void fetch(){
//Only dogs can do this
}
}
So, jetzt lassen Sie uns sagen, ich habe eine Instanz von Animal (eine, die nicht ein Hund ist). Ich muss es im Grunde in einen Hund niederschlagen. Ich habe gehört, dass Downcasting nicht direkt in Java unterstützt wird, aber gibt es einen Workaround dafür?
public class AnimalExample{
public static void main(String[] args){
Animal animal = MyApi.getAnAnimal();
//Dog dog = (Dog) animal; ---throws a runtime error
Dog dog = Dog.getDog(animal); //Maybe something like this?
//Then I should be able to call both eat() and fetch()
dog.eat();
dog.fetch();
}
}
Noch einmal, ich verstehe, dass Downcasting nicht direkt unterstützt wird. Aber es muss ein Workaround dafür geben, und ich kann es nicht herausfinden. Ich weiß, dass ich eine Wrapper-Klasse verwenden könnte (zB DogWrapper
), aber das wäre etwas schwieriger, als ich es gerne hätte, weil ich immer noch die Dutzende von Superklassen-Methoden anrufe.
UPDATE: Ich verstehe, dass es noch kein Hund ist, aber ich fragte mich, ob es einen Weg gab, es in einen Hund umzuwandeln. Es klingt im Grunde nach dem, was die Leute sagen, dass ich es entweder manuell konvertieren muss (kopiere jedes Attribut/jede Methode einzeln) oder verwende einfach eine Wrapper-Klasse. Ein Wrapper-Kurs scheint viel weniger chaotisch zu sein, also muss ich leider diesen Weg gehen. So wird DogWrapper
eine fetch()
Methode und eine getAnimal()
Methode haben. Also wenn ich die Dog
essen möchte, dann muss ich dog.getAnimal().eat()
anrufen. Ich habe es vermieden, das zu tun, aber ich denke, es gibt keinen Weg. Sieht jemand etwas einfacher als das?
„Ich brauche es im Wesentlichen in einen Hund zu niedergeschlagenen“ Aber es ist * nicht * a 'dog'. Du kannst nicht einen Nicht-Hund bitten, sich wie ein 'Hund' zu verhalten. Downcasting * wird * unterstützt, aber es ist sicher ausgeführt ... die Umwandlung ist nur erfolgreich, wenn der Ausführungszeittyp mit dem angeforderten Typ kompatibel ist. Was würden Sie von 'dog.fetch()' erwarten? Was passiert, wenn es einige in 'Dog' deklarierte Felder verwendet, die nicht im eigentlichen Objekt sind? –
Also, du hast ein 'Tier', das kein' Hund' ist, aber du willst es trotzdem behandeln, als wäre es ein 'Hund'. Sie müssen es selbst in einen 'Hund' umwandeln; Java kann nicht selbst wissen, wie das geht. (Und warum glaubst du, dass das nützlich ist? Wenn das Tier kein 'Hund' ist, was sollte es dann tun, wenn du eine Methode namens" Hund "nennen würdest?). – Jesper
Ich würde vorschlagen, etwas zu tun wie if (Tier instanceof Dog) {Hund dog = (Hund) Tier} else {// handle problem case} – mdewit