Bedeutung von <> beim Interface und der Klassen

weitiweit

Grünschnabel
Guten Abend,

ich bin gerade dabei Java zu erlernen und habe nun eine kleine Frage.

Was bedeuten die klammern <> beim Interface und der Klassen?

Code:
interface Cookable <T>

HashMap<>()
 

sheel

I love Asm
Hi

Stichwort "Generics":

Eine Klasse "MeineKlasse" ohne <> hat innen ja Membervariablen, Methoden mit Parametern und Rückgabewerten, lokale Variablen in den Methoden, usw.usw. . Diese ganzen Sachen haben Typen wie int, float, String, MeineAndereKlasse usw.

Mit "MeineKlasse<T>" hat man innerhalb der Klasse auch den Typ T zur Verfügung (kann man auch anders nennen). Was genau das sein soll, kann man dann außerhalb beim Alegen von Objekten bestimmen.
Java:
MeineKlasse<int> a = new MeineKlasse<int>(); //hier ist T int
MeineKlasse<float> a = new MeineKlasse<float>(); //hier ist T float
usw.

Kurz, man implementiert man eine Klasse (oder auch ein Interface) für alle möglichen Datentypen, und kann beliebige Sachen einsetzen.

Weiteres dazu:

Man kann auch beschränken, dass nur Typen erlaubt sind, die von bestimmten Klassen und/oder Interfaces erben (statt alle Typen). Hilfreich vor allem dann, wenn man Werte von dem Typ nicht nur speichern will, sondern auch etwas tun will damit: In einer MeineKlasse<T>, mit einer Variable "T meinT;" innen, kann man von meinT keine Methoden aufrufen. Weil ganz egal welche Klasse man als Typ später einsetzt, zu dem Zeitpunkt gibt es ja keine Garantie, dass die eingesetzten Klassen so eine Methode überhaupt haben (oder man könnte auch int/float/usw. einsetzen, die ja gar keine Methoden haben). Mit einer Beschränkung, dass T ein bestimmtes Interface implementieren muss, darf man dann die Methoden von dem Interface verwenden.

Wenn eine Klasse B von einer Klasse/Interface A<T> erbt, kann es entweder auch generisch B<T> sein, oder beim erben zB. A<int> angeben und so speziell die int-Variante von nehmen.

Ein "Problem" bei Vererbungen: Wenn es eine Klasse A gibt, und eine Klasse B die von A erbt, kann man A-Variablen ja auch B-Objekte zuweisen. X<A> kann aber kein X<B> aufnehmen.

Mit Reflection usw. ist alles etwas umständlicher ... aber das kann warten bis man es braucht.