Interface Casting

friednoodles

Aktives Mitglied
Hi, ich habe folgenden Code

1. Mein Interface iVehicle

Java:
public interface IVehicle {
    
    String getName();
    int getSeats();
    void setVehicle(String name, int seats);   
}

2. ein IVehicile objekt und die Methode setVehicle

Java:
    static IVehicle _ivehicle;
    
    public static void setVehicle(IVehicle ivehicle) {
        
        _ivehicle = ivehicle;
        
        Bike bike = (Bike)ivehicle;
        
    }

3. Meine Main die in der selben Klasse wie setVehicle ist und und setVehicle mit drei verschiedenen Klassen anspricht die IVehicle implementieren

Java:
    public static void main(String[] args) {
 
        setVehicle(new Bike());
        setVehicle(new Car());
        setVehicle(new Airplane());
        
    }

Der erste Aufruf von setVehicle funktioniert gut.
Wie schaffe ich es das der Code auch bei den letzten beiden Aufrufen funktioniert?

Ich bekomme folgendes sobald setVehicle(new Car()) aufgerufen wird.
Java:
 Exception in thread "main" java.lang.ClassCastException: Car cannot be cast to Bike

An sich verstehe ich warum der Fehler auftaucht. Aber wie kann ich ihn umgehen?
 
K

kneitzel

Gast
Oder wenn Du dafür sorgst, dass Car und Airplane auch Bikes sind, sprich: Diese von Bike erben. Macht aber logisch natürlich keinen Sinn, aber das ginge natürlich als Lösung ebenfalls.
 

friednoodles

Aktives Mitglied
Entschuldigt bitte, ich habe die Frage ein wenig falsch gestellt.
Eigentlich wollte ich überprüfen ob
Java:
 ivehicle
eine Instanz der Klasse Bike, Car oder Airplane ist und ich bin falsch an die Sache ran gegangen wie @mihe7 schon beschrieben hat.

Wollte das hier hinbekommen:
Java:
    public static void setVehicle(IVehicle ivehicle) {

        _ivehicle = ivehicle;
        if (ivehicle instanceof Bike) {
            Bike bike = (Bike) ivehicle;
        } else if(ivehicle instanceof Car) {
            Car car = (Car) ivehicle;
        } else if(ivehicle instanceof Airplane) {
            Airplane airplane = (Airplane) ivehicle;
        }


    }

Nun stellt sich mir aber die Frage warum man das überhaupt macht.
Was für einen Sinn hat diese überprüfung? Kann mir das jemand erklären?

edit: Habe die docs schon durchgelesen, aber die helfen mir nicht wirklich weiter..
 
K

kneitzel

Gast
Das kann man machen, aber das macht meist keinen Sinn. Wir bilden meist ja (mehr oder weniger vereinfacht) das Leben ab.

Beispiel:
In einem Flugzeug werden Menschen transportiert. Ggf. gibt es Grenzen, so dass eine Fluglinie sagt: Über 2m nehmen wir jemanden nicht mit. Oder unter 1,20 nehmen wir nur mit Kindersitz mit oder was weiss ich.... Aber es sind alles Menschen.

Nun kann es zu einen medizinischen Notfall kommen, also wird gefragt: Ist ein Arzt an Board. Also kann ich durchgehen: Für jeden Menschen an Board prüfe ich, ob er ein Arzt ist. So es ein Arzt ist, will ich natürlich, dass der Arzt den Menschen, der erkrankt ist, behandelt. Also sowas wie arztInstanz.behandeln(krankerMensch). behandeln(Mensch) ist aber eine Funktion, die natürlich nicht Bestandteil von Mensch ist sondern von der Klasse Arzt.

Somit wird klar: Wenn Du nun irgendwas spezielles brauchst, dann musst Du natürlich den Cast zu einem entsprechenden Typ machen.

Aber so oft wird dies nicht gemacht. Und das hat einen guten Grund: Man will Abhängigkeiten möglichst gering halten. Je mehr Abhängigkeiten es untereinander gibt, desto komplexer wird etwas. Die Fluglinie will ja nur Menschen Transportieren und so. Da jetzt sonst irgendwelche Abhängigkeiten mit einzubauen ist natürlich sau blöd! Zumal das ja auch komplexer werden kann. Es gibt ja evtl. auch noch Rettunssanitäter, Rettungsassistent, Krankenschwester, NotfallSanitäter, MedizinStudent, ....

Daher ist es nach meiner Erfahrung (Die aber natürlich nur eine sehr kleine Sicht auf die ganze Software Entwicklung ist) eher üblich, dass man auf Interfaces baut. Dann gibt es MedizinischGeschultesPerson und die kann hilfeLeisten oder so ähnlich.

Aber das geht dann schon sehr weit und ist dann etwas, das sehr stark meine persönliche Meinung ist....
 

AndiE

Top Contributor
Mir ist noch nicht klar, welchen Sinn die Sache hat, und wieso nicht "extends" und implements" benutzt wird.

Dumme Frage:

Wie würde ich denn am besten das Interface zu einer Klasse kennzeichnen: "Interface" und "class ImplInterface"?
 
K

kneitzel

Gast
Doch, _ ist erlaubt. Nach JLS Kapitel 3.8 fängt ein Identifier mit einem JavaLetter an und danach kommen JavaLetterOrDigit.

Und was ein JavaLetter ist, wird durch Character.isJavaIdentifierStart(int) definiert:
https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isJavaIdentifierStart(char)

Und da gehört auch _ dazu.

(Ich finde übrigens gut, wenn interne Variablen mit _ anfangen. Das verhindert dann diese this.something = something Zeilen, die ich für sehr unglücklich halte. Da dann lieber ein _something = something. Aber das ist eine persönliche Meinung und im Java Umfeld ist dies tatsächlich eher ungewöhnlich. Aber z.B. im C# Bereich ist das durchaus üblich ....)
 

mrBrown

Super-Moderator
Mitarbeiter
Doch, _ ist erlaubt. Nach JLS Kapitel 3.8 fängt ein Identifier mit einem JavaLetter an und danach kommen JavaLetterOrDigit.

Und was ein JavaLetter ist, wird durch Character.isJavaIdentifierStart(int) definiert:
https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isJavaIdentifierStart(char)

Und da gehört auch _ dazu.
Wobei ein '_' allein allerdings nicht möglich ist.

(Ich finde übrigens gut, wenn interne Variablen mit _ anfangen. Das verhindert dann diese this.something = something Zeilen, die ich für sehr unglücklich halte. Da dann lieber ein _something = something. Aber das ist eine persönliche Meinung und im Java Umfeld ist dies tatsächlich eher ungewöhnlich. Aber z.B. im C# Bereich ist das durchaus üblich ....)
Das Thema hatten wir ja letztens schon mal :D geht halt irgendwann beim Refactoring kaputt (und sieht einfach hässlich aus :p )
 
K

kneitzel

Gast
Wobei ein '_' allein allerdings nicht möglich ist.

Das stimmt nicht zu 100%. Bis Java 1.7 funktionierte ein _ als Variablenname. Erst mit Java 1.8 wurde eine Warnung eingebaut und mit 1.9 gab es dann den Fehler.

Erklärung ist, dass _ ein Keyword geworden ist: JLS 3.9: Keywords https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.9

Hintergrund ist meines Wissens JEP 302: Lambda Leftovers: http://openjdk.java.net/jeps/302
Da ist vorgesehen, dass man mit dem _ nicht verwendete Parameter kennzeichnen können soll. Als ein mögliches Beispiel nennt das JEP da z.B.:
Java:
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
 

mrBrown

Super-Moderator
Mitarbeiter
Das stimmt nicht zu 100%. Bis Java 1.7 funktionierte ein _ als Variablenname. Erst mit Java 1.8 wurde eine Warnung eingebaut und mit 1.9 gab es dann den Fehler.
Wer benutzt denn noch Java 7 oder 8 :p (aber vielleicht sollte ich dazu schreiben, dass ich mich nur auf die aktuellen Versionen beziehe...)

Java 1.9 gibts btw nicht, das ist nur noch 9 ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
P Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8
D Interface namen bekommen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben