Rohtypen in Java

1. Einleitung

In diesem kurzen Tutorial werden wir uns die Rohtypen ansehen, was sie sind und warum wir sie vermeiden sollten.

2. Rohtypen

Ein Rohtyp ist ein Name für eine generische Schnittstelle oder Klasse ohne Typargument:

List list = new ArrayList(); // raw type

Anstatt von:

List listIntgrs = new ArrayList(); // parameterized type

Liste ist ein parametrisierte Typ von Schnittstellenliste während Liste a raw Art von Schnittstellenliste .

Raw-Typen können bei der Schnittstelle mit nicht generischem Legacy-Code hilfreich sein.

Ansonsten wird davon abgeraten. Das ist weil:

  1. Sie sind nicht ausdrucksstark
  2. Ihnen fehlt die Typensicherheit, und
  3. Probleme werden zur Laufzeit und nicht zur Kompilierungszeit beobachtet

3. Ausdruckslos

Ein Rohtyp dokumentiert nicht und erklärt sich selbst wie ein parametrisierter Typ.

Wir können leicht schließen, dass ein parametrisierter Typ List eine Liste ist, die String s enthält . Einem Rohtyp fehlt jedoch diese Klarheit, was es schwierig macht, mit ihm und seinen API-Methoden zu arbeiten.

Sehen wir uns die Signatur der Methode get (int index) in der List- Oberfläche an, um dies besser zu verstehen:

/** * Returns the element at the specified position in this list. * * @param index index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException if the index is out of range * (index = size()) */ E get(int index);

Die Methode get (int index) liefert einen String an der Position Index in parametrisierte Typ Liste .

Doch für eine rohe Art Liste , es gibt ein Objekt . So werden wir zusätzliche Anstrengungen zu treffen , um die Art des Elements in der rohen Art zu untersuchen und zu identifizieren Liste und fügen Sie ein geeignetes Typ-Casting. Dies kann zur Laufzeit zu Fehlern führen, da der Rohtyp nicht typsicher ist .

4. Nicht typsicher

Wir erhalten vorgenerisches Verhalten mit Rohtypen. Daher wird eine Roh - Typ - Liste akzeptiert Objekt und kann ein Element eines beliebigen Datentypen halten . Dies kann zu Problemen mit der Typensicherheit führen, wenn wir parametrisierte und rohe Typen mischen.

Lassen Sie uns dies sehen, indem Sie Code erstellen, der eine Liste instanziiert, bevor Sie sie an eine Methode übergeben, die den Rohtyp List akzeptiert und eine Ganzzahl hinzufügt :

public void methodA() { List parameterizedList = new ArrayList(); parameterizedList.add("Hello Folks"); methodB(parameterizedList); } public void methodB(List rawList) { // raw type! rawList.add(1); }

Der Code kompiliert wird (mit einer Warnung) und die Integer wird zu der rohen Typ hinzugefügt Liste , wenn sie ausgeführt. Die Liste , die als Argument übergeben wurde, enthält jetzt einen String und eine Ganzzahl .

Der Compiler druckt eine Warnung aufgrund der Verwendung von Rohtypen aus:

Note: RawTypeDemo.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

5. Probleme zur Laufzeit

Die mangelnde Typensicherheit eines Rohtyps hat einen kausalen Effekt, der zur Laufzeit zu Ausnahmen führen kann.

Lassen Sie uns das vorherige Beispiel so ändern, dass methodA das Element an der Indexposition 1 unserer Liste erhält, nachdem methodB aufgerufen wurde :

public void methodA() { List parameterizedList = new ArrayList(); parameterizedList.add("Hello Folks"); methodB(parameterizedList); String s = parameterizedList.get(1); } public void methodB(List rawList) { rawList.add(1); }

Der Code wird kompiliert (mit derselben Warnung) und löst bei der Ausführung eine ClassCastException aus . Dies geschieht, wenn die Methode get (int index) eine Ganzzahl zurückgibt , die keiner Variablen vom Typ String zugewiesen werden kann :

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

6. Fazit

Raw-Typen sind schwer zu bearbeiten und können Fehler in unserem Code verursachen.

Ihre Verwendung kann zu katastrophalen Folgen führen, und leider ereignen sich die meisten dieser Katastrophen zur Laufzeit.

Schauen Sie sich alle Schnipsel in diesem Tutorial auf GitHub an.