3 Stimmen

Casting der Klasse eines Objekts

Meine bisherigen OOP-Erfahrungen habe ich mit Objective-C gemacht (das dynamisch typisiert ist), aber jetzt lerne ich Java. Ich möchte über eine ArrayList von Objekten iterieren und eine bestimmte Methode für sie ausführen. Jedes Objekt in der ArrayList ist von der gleichen Klasse. In Objective-C würde ich einfach bei jeder Iteration prüfen, ob das Objekt der richtigen Klasse angehört, und dann die Methode ausführen, aber diese Technik ist in Java nicht möglich:

for (Object apple : apples) {
        if (apple.getClass() == Apple.class) {
            apple.doSomething(); //Generates error: cannot find symbol
        }
    }

Wie "sage" ich dem Compiler, zu welcher Klasse die Objekte in der ArrayList gehören?

10voto

danben Punkte 77356

In Java 5 und später werden Sammeltypen generiert. Sie würden also dies haben:

ArrayList<Apple> a = getAppleList(); // list initializer

for (Apple apple : a) {
    apple.doSomething();
}

Es ist im Allgemeinen keine gute Praxis, über ArrayList s von Object es sei denn, Sie benötigen speziell Ihre ArrayList verschiedene Arten von Produkten halten können Objects . Normalerweise ist das nicht der Fall, und Sie können heterogene Sammlungen für eine erhöhte Typsicherheit verwenden.

5voto

akf Punkte 37387

Für das traditionelle Gießen, bedenken Sie dies:

for (Object apple : apples) {
    if (apple instanceof Apple) { //performs the test you are approximating
        ((Apple)apple).doSomething(); //does the cast
    }
}

in späteren Versionen von Java, Generika wurden eingeführt, die diese Art von Tests überflüssig machen.

1voto

meriton Punkte 65030

Lesen der Abschnitt über Casting aus dem Java-Tutorial sollte diese Frage beantworten.

(Oder, wenn Sie die ArrayList selbst deklarieren, verwenden Sie einen geeigneten Typ-Parameter, wie danben vorschlägt=

0voto

Erkan Haspulat Punkte 11302

Sie müssen die Object Apfel bis Apple .

((Apple)apple).doSomething();

Aber in diesem speziellen Fall ist es besser, sie zu verwenden;

for(Apple apple : apples){
    apple.doSomething();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X