Verständnisfrage zu Casts auf Interfaces

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Hey,

ich hab mal wieder eine Verständnisfrage:

Ich hab vor kurzem folgenden Code geschrieben, als es um das Vergleichen von beliebigen Datentypen auf Größe ging:

Code:
	private static Object getArrMax(Object[] arr) {
		// start with first value
		Object max = arr[0]; 
		for(int i = 0; i < arr.length; i++) {
			if(((Comparable) arr[i]).compareTo(max) > 0) {
				max = arr[i];
			}
		}
		return max;
	}

Eigentlich soweit alles klar, nur ist mir aufgefallen, das ich eine Zeile wie diese

Code:
			if(((Comparable) arr[i]).compareTo(max) > 0) {

schon oft verwendet habe, ohne eigentlich genau zu verstehen, was da passiert und warum das funktioniert.

Comparable ist ja ein Interface und keine Klasse.

Nun frage ich mich:


Wie läuft das intern?

Wieso kann ich ein Objekt auf ein Interface casten?

Das ich ein Objekt auf ein anderes Objekt casten kann ich ja verständlich, aber wieso auf ein Interface, welches doch keinen konkreten Typ hat?
 

Wildcard

Top Contributor
Was macht casten anderes, als dem Compiler zu sagen welche Methoden/Felder ein Objekt zur Verfügung stellt?
Wenn eine Klasse ein Interface implementiert, ist klar, das sie dessen Methoden implementieren muss, also kann man auch auf den Interface Typ casten. Wenn man das nicht könnte, bräuchte man eigentlich gar keine Interfaces.
 

musiKk

Top Contributor
Comparable stellt ja nur sicher, dass eine Klasse die Methode compareTo() implementiert. Was du hier sagst, heisst ja, dass das i-te Element von arr dieses Interface implementiert, mehr nicht. Interfaces haben ja zur Laufzeit keine Bedeutung mehr (denke ich jedenfalls), sondern nur bei der Kompilierung.

Auf diese Idee waere ich allerdings um ehrlich zu sein nicht gekommen. :D
 

jollyroger

Bekanntes Mitglied
Was macht casten anderes, als dem Compiler zu sagen welche Methoden/Felder ein Objekt zur Verfügung stellt?

Ok,

ich glaube du liegst damit nicht 100% richtig.

Aus http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html

A specific conversion from type S to type T allows an expression of type S to be treated at compile time as if it had type T instead. In some cases this will require a corresponding action at run time to check the validity of the conversion or to translate the run-time value of the expression into a form appropriate for the new type T.

Ich hatte immer gedacht, "casting" würde wirklich den Typ S zu T machen bzw. konvertieren.

Aber da lag ich wohl falsch......

EDIT:

Bzw. lag ich wohl nicht so ganz falsch, wie in dem zitierten Text auch steht:

In some cases this will require a corresponding action at run time to check the validity of the conversion or to translate the run-time value of the expression into a form appropriate for the new type T.

Sprich, in dem von mir exemplarisch genannten Fall meiner Funktion würde dann wohl das hier

A specific conversion from type S to type T allows an expression of type S to be treated at compile time as if it had type T instead.

zutreffen, in diesem Fall

A conversion from type double to type long requires a nontrivial translation from a 64-bit floating-point value to the 64-bit integer representation. Depending on the actual run-time value, information may be lost.

würde das hier zutreffen:

In some cases this will require a corresponding action at run time to check the validity of the conversion or to translate the run-time value of the expression into a form appropriate for the new type T.

sprich, hier würde dann auch wirklich eine Typ-Anpassung stattfinden.

Was ja mehr ist, als nur

Was macht casten anderes, als dem Compiler zu sagen welche Methoden/Felder ein Objekt zur Verfügung stellt?
 

Wildcard

Top Contributor
Du sprichst von einem cast auf ein Interface, was aus offensichtlichen Gründen etwas anderes sein muss als ein cast eines primitiven Datentyps.
Es ist natürlich sehr vereinfacht wenn ich sage: ein cast macht gar nichts, trifft aber den Kern.
Hätte ich aus deiner Frage entnehmen können, das du mit dem Konzept von Single-, Double- und Multidispatch bereits vertraut bist, wäre ich evtl. mehr ins Detail gegangen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
C try-catch Block Verständnisfrage Allgemeine Java-Themen 14
RalleYTN Collections Verständnisfrage zu Objektreferenzen in Listen Allgemeine Java-Themen 5
O log4j - Verständnisfrage Allgemeine Java-Themen 1
M Verständnisfrage bei Hausaufgabe Allgemeine Java-Themen 7
L Getter und Setter Verständnisfrage Allgemeine Java-Themen 10
H MVC - Verständnisfrage Allgemeine Java-Themen 12
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
E Verständnisfrage bezüglich Threads Allgemeine Java-Themen 4
agent47 Plugin System Verständnisfrage Allgemeine Java-Themen 6
T Verständnisfrage bei Nachbarschaftsbetrachtung Allgemeine Java-Themen 8
M Verständnisfrage Exceptions Allgemeine Java-Themen 2
A Generics Verständnisfrage Allgemeine Java-Themen 7
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
J Verständnisfrage zu exceptions Allgemeine Java-Themen 3
J volatile Verständnisfrage Allgemeine Java-Themen 6
S JAAS - Verständnisfrage Allgemeine Java-Themen 2
G allgemein synchroniszed verständnisfrage Allgemeine Java-Themen 19
V FileWriter und Zahlen (Kein Problem, nur Verständnisfrage) Allgemeine Java-Themen 4
K Verständnisfrage. Allgemeine Java-Themen 9
T Eine Verständnisfrage Allgemeine Java-Themen 15
T Kleine Verständnisfrage zu Stringbuffer Allgemeine Java-Themen 2
sliwalker Verständnisfrage ObserverPattern Allgemeine Java-Themen 2
I Denkfehler bei Interfaces und Casts? Allgemeine Java-Themen 12
T Generics, Enumerations und Type-Casts Allgemeine Java-Themen 13
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
S Interfaces Allgemeine Java-Themen 10
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
P Interfaces Allgemeine Java-Themen 1
K Wohin mit Interfaces? Allgemeine Java-Themen 2
J Interface Wofür Interfaces in Java verwenden? Allgemeine Java-Themen 3
F Namen des Interfaces ausgeben Allgemeine Java-Themen 1
P ClassCastException bei Verwendung eines Interfaces Allgemeine Java-Themen 7
F Sinn des Serializable Interfaces Allgemeine Java-Themen 8
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
D Java Interfaces Allgemeine Java-Themen 3
sylo toString() Methode eines Interfaces überladen. Allgemeine Java-Themen 17
S statische Interfaces..? Allgemeine Java-Themen 6
M Frage zu Interfaces (Beispiel: Comparable) Allgemeine Java-Themen 13
I Interfaces und abstrakte Methoden Allgemeine Java-Themen 5
C Verständnis zur Strukturierung von Java-Projekten/Interfaces Allgemeine Java-Themen 2
M Methodenaufrufe sind über Interfaces langsamer. Allgemeine Java-Themen 43
J Statische Methoden in Interfaces? Allgemeine Java-Themen 10
J Immutable mit Interfaces möglich? Allgemeine Java-Themen 2
G verzweiflung pur mit java interfaces Allgemeine Java-Themen 5
M Bereits imlplementierte Interfaces nochmal bei "impleme Allgemeine Java-Themen 10
T Nochmal Frage zu Vererbung Interfaces etc. Allgemeine Java-Themen 10
F Implementierte Interfaces ermitteln Allgemeine Java-Themen 6
T JDBC: Unterschiede in Interfaces zwischen 2 Java-Versionen. Allgemeine Java-Themen 6
E Attribute in Interfaces möglich? Allgemeine Java-Themen 17
M 2 Java-Interfaces öffnen in Unix Allgemeine Java-Themen 4
B "Instantiieren" eines Objekts eines Interfaces Allgemeine Java-Themen 10
F Problem: mehrere Interfaces definieren equals() neu Allgemeine Java-Themen 24
F Probleme mit Interfaces Allgemeine Java-Themen 3
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
S Methoden aus Interfaces mit unterschiedlichen Parametertypen Allgemeine Java-Themen 7
deetee Wie nennt man Interfaces wie Serializable? Allgemeine Java-Themen 8
B Elegantere Lösung bei der Implementierung eines Interfaces Allgemeine Java-Themen 2
N 2 Interfaces mit Methoden selber Signatur implementieren Allgemeine Java-Themen 5
D Implementierungen eines Interfaces finden Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben