Frage zu Collections.frequency()

  • Themenstarter Themenstarter sin777
  • Beginndatum Beginndatum
S

sin777

Gast
Hallo, die Frage ist eher allgemein aber an diesem Beispiel wird mein Verständnisproblem zumindest deutlich. Die Methode Collections.frequency() hat als zweiten Parameter ein Object. Wenn ich jetzt bspw. eine Collection mit Strings habe und schauen will wie oft ein bestimmtes Wort darin vorkommt, dann funktioniert die Methode Collections.frequency() einwandfrei. Meine Frage ist aber nun: Warum?
Der Datentyp ist nicht generisch sondern nur vom Typ Object. Wie kann es dann sein, dass alle Elemente aus der Collection mit einem equals() von einem Object verglichen werden können...Object definiert doch die Methode equals() sicherlich ganz anders als String. Und intern kann doch nun nicht für jedes mögliche Objekt ein instanceof-Befehl gemacht werden. Mich würde nur generell einmal interessieren, wie das denn funktioniert. In diesem Zusammenhang: Warum funktioniert Folgendes:

PHP:
Object obj = "testen";
System.out.println(obj.equals("testen"));

obj dürfte doch jetzt gar nichts von der equals-Methode von String wissen, da es im Container Object ist.

Ich hoffe ihr versteht mein Problem und könnt mir das vllt erklären, das würde mich wirklich sehr freuen.


Vielen Dank im Voraus
 
Dein Verständnisproblem liegt schon darin, dass du denkst
Code:
obj
wäre ein Object 🙂
obj ist und bleibt aber ein String (eig. steht da ja so etwas wie new String("testen"). Es wird also eine Instanz von String erstellt, demnach wird dann auch die überschriebene equals Methode aufgerufen!

Java:
class Foo{
	@Override
	public boolean equals(Object obj) {
		System.out.println("Foo");
		return super.equals(obj);
	}
}
Java:
	public static void main(String[] args) throws Exception {
		Object obj = new Foo();
		System.out.println(obj.equals("testen"));  
	}
 
Dass der Typ als
Code:
Object
angegeben wurde, ändert nichts daran, dass das Objekt einen spezielleren Typen haben kann.

Wenn ein Objekt die Methode
Code:
equals
überschreibt wird eben diese aufgerufen, egal, was die Superklassen dort stehen haben, wenn nicht, wird die Suche eine 'Vererbungstiefe' nach hinten verlegt, bis ein Typ mit dieser Methode gefunden wird.

Durch die Klasse
Code:
Object
ist sichergestellt, dass diese Methode spätestens dort gefunden wird, auch wenn es nur ein selten sinnvolles
Code:
return (this == obj);
ist.

--

eRaaaa hat gesagt.:
[...] dass du denkst
Code:
obj
wäre ein Object
Ist es ja auch, sogar noch mehr als das, es ist ein
Code:
String extends Object
!
Das ist doch der ganze Witz an Vererbung; wodurch dieser ganze Haufen Code nicht nur einfach gültig ist und kompiliert sondern auch noch Sinn macht.
 

Zurück
Oben