"Class<T> clazz" im Constructor - auch für int möglich?

marcobolten

Mitglied
Hi,
ich bin dabei, mir eine generische Arrayklasse zu basteln (nutze ich später für Sortierverfahren). Ich kenne ArrayList, will aber Java lernen (komme von C++) und daher gerade lieber selber was bauen.

Mein Constructor sieht so aus:
Java:
public ArrayClass(Class<T> clazz, int capacity)
    {
        m_length = 0;
        m_capacity = capacity;
        m_elements = (T[]) Array.newInstance(clazz, capacity);
    }

Ich habe, diesem Beispiel folgend, die Klasse so instantiiert:
Code:
ArrayClass<String> myArray = new ArrayClass(String.class, 5);

Das funktioniert.

Code:
ArrayClass<int> myArray2 = new ArrayClass(int.class, 5);
hingegen gibt die Fehlermeldung (beim ersten int): unexpected type / required: reference / type: int

Kann man so etwa auch mit int/boolean/long etc. machen?
 

httpdigest

Top Contributor
Kann man so etwa auch mit int/boolean/long etc. machen?
Nein. Zumindest nicht direkt bzw. mit den primitiven Typen.

Java (im Gegensatz zu z.B. C++ Templates) verwendet keinen Templating-Ansatz sondern Type Erasure für die Umsetzung von parametrischem Polymorphismus (aka. "Generics" in Java).
Das bedeutet, dass jedes Typargument einer generischen Klasse immer von java.lang.Object ableiten muss. Das tun die primitiven Typen nicht, weil sie keine Referenztypen sind.

Um dem zu begegnen, gibt es die "Wrapperklassen" wie etwa java.lang.Integer, java.lang.Boolean oder java.lang.Long. Diese können als Typargumente verwendet werden.
 

marcobolten

Mitglied
Vielen Dank, httpdigest!

Ich werde im Moment nur teilschlau aus Type Erasure, werde das aber in Ruhe nachlesen. Das scheint eine wichtige und grundsätzliche Sache zu sein, die Java- und C++-Denken unterscheidet. Danke für den Input!

Der letzte Satz heißt aber für meine Frage dann eigentlich doch "ja", denn
Java:
ArrayClass<java.lang.Integer> myArray2 = new ArrayClass(java.lang.Integer.class, 5);
scheint anstandslos zu funktionieren.
Ein Aufruf mit
Code:
int i = 4;
myArray2.append(i);
funktioniert auch - ich freue mich gerade sehr. Oder übersehe ich da größere Nachteile?
 

KonradN

Super-Moderator
Mitarbeiter
Oder übersehe ich da größere Nachteile?
Du solltest Dir bewusst sein, dass int immer einen Wert hat aber ein Integer kann auch null sein. Sprich: ein myArray2.append(null) würde erst einmal auch funktionieren. Wenn Du dann aber hier den Wert in einen int ausliest, dann bekommst Du eine NPE.

Das ist ein Punkt, auf den man ggf. achten sollte.
 

temi

Top Contributor
Was man aus dem Beitrag von @KonradN herauslesen kann, noch einmal explizit erwähnt: Bei Integer handelt es sich, im Gegensatz zu int, um eine Klasse (die einen int-Wert kapselt) und um sie verwenden zu können werden Instanzen davon benötigt.

Der Compiler erzeugt diese Instanzen automatisch, anstatt von Integer i = new Integer(42); funktioniert dadurch auch Integer i = 42; anstandslos.

Du kommst ja aus einer Sprache, wo gerne auf Geschwindigkeit geachtet wird. Obwohl die Regel lautet, dass man nicht optimieren soll (die Regel ist länger, ich bin zu faul), sollte man hier etwas aufpassen:
Java:
Long sum = 0L;
for (long i = 0; i > Integer.MAX_VALUE; i++) {
    sum += i; // Achtung!
}

Da die Variable sum ein Long (mit groß geschriebenem L) ist, werden hier implizit sehr viele Instanzen innerhalb der Schleife erzeugt! Das wird sich in der Laufzeit deutlich bemerkbar machen.
 
Zuletzt bearbeitet:

temi

Top Contributor
Mein Constructor sieht so aus:
Java:
public ArrayClass(Class<T> clazz, int capacity)
{
m_length = 0;
m_capacity = capacity;
m_elements = (T[]) Array.newInstance(clazz, capacity);
}
Was übrigens auch funktioniert:
Java:
public ArrayClass(int capacity)
    {
        m_length = 0;
        m_capacity = capacity;
        m_elements = (T[]) new Object[capacity];
    }

Und die Erzeugung einer Instanz davon:
Code:
ArrayClass<String> myArray = new ArrayClass<>(5);
 
Zuletzt bearbeitet:

temi

Top Contributor
Hier solltest du aufpassen, bzw. sollte eine gute IDE eine Warnung spendieren ("RAW use of parameterized class"):
Code:
ArrayClass<String> myArray = new ArrayClass(String.class, 5);

Du hast bei der Erzeugung deiner ArrayClass die "<>" weg gelassen.

Eine Instanz einer generischen Klasse wird normalerweise so erzeugt:
Java:
ArrayList<String> list = new ArrayList<String>();

// bzw. unter Verwendung eines Interfaces

List<String> list = new ArrayList<String>();

Seit Java 1.7 gibt es den Diamond-Operator, so das dieses die einfachere Form davon ist:
Java:
List<String> list = new ArrayList<>();

Vor allem, wenn du bei der Deklaration der Variablen, den Rohtypen verwendest, hat das erhebliche Folgen. Da der Rohtyp "Object" entspricht, erhältst du eine ArrayList<Object> und kannst jeden beliebigen Typen übergeben:
Java:
ArrayList list = new ArrayList<String>(); // Typangabe bei der Deklaration von 'list' vergessen
 
list.add("Hallo Welt"); // funktioniert erst mal
list.add(42); // das auch
 
Zuletzt bearbeitet:

Neumi5694

Top Contributor
Seit Java 1.7 gibt es den Diamond-Operator, so das dieses die einfachere Form davon ist:
Java:
List<String> list = new ArrayList<>();
Nur der Vollständigkeit halber: Mittlerweile kann man auch den umgekehrten Weg gehen.
Less:
var list = new ArrayList<String>();
Damit behandelt der Compiler "list" als "ArrayList<String>". Merke: Es ist dann die 'echte' Klasse (mit allen zusätzlichen Eigenschaften), nicht das Interface. Links wird verwendet, was rechts steht.

Noch ein kleiner Punkt zur Geschwindigkeit. Davon abgesehen, dass der Compiler eh gewisse Optimierungen vornimmt, ist der Geschwindkeitsverlust einer "Long" Schleife irrelevant. Dies wäre bei Prozessoren ein Problem, die keine Pipeline haben, also sehr, sehr ,sehr, sehr alten Prozessoren. Mittlerweile sind aber mehrere Befehle in einer Pipeline genauso schnell bearbeitet wie ein einzelner. Die richtige Länge einer Pipeline ist immer ein Balanceakt beim Design.Viele Schleifen mit je einem Befehl sind allerdings langsamer als eine Schleife mit mehreren Befehlen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
U Interface | constructor injection Java Basics - Anfänger-Themen 5
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
S Copy - Constructor vs clone() Java Basics - Anfänger-Themen 20
F The constructor Vehikel(String, int) is undefined warum?? Java Basics - Anfänger-Themen 4
L constructor cannot be applied... Java Basics - Anfänger-Themen 22
L Constructor is undefined Java Basics - Anfänger-Themen 4
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
S CSVReader funktioniert nicht ---- The Constructor CSVReader(String) is undefined Java Basics - Anfänger-Themen 4
M Vererbung - Cannot Find Symbol constructor... Java Basics - Anfänger-Themen 11
S The constructor File(URL) is undefined Java Basics - Anfänger-Themen 10
N Klassen constructor Rückgabewert Java Basics - Anfänger-Themen 10
S Constructor und Main Methode Java Basics - Anfänger-Themen 3
S cannot find symbol, symbol: constructor Java Basics - Anfänger-Themen 2
B Copy-Constructor Java Basics - Anfänger-Themen 6
L Erste Schritte Super Constructor mit Array - Liste? Java Basics - Anfänger-Themen 15
T Cannot refer to an instance field xxx while explicitly invoking a constructor Java Basics - Anfänger-Themen 14
M Was macht bzw. was bringt ein constructor? Java Basics - Anfänger-Themen 12
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
W Default Constructor Java Basics - Anfänger-Themen 4
H OOP java.sql.Date does not have a no-arg default constructor Java Basics - Anfänger-Themen 2
S Array of objects und ständige Constructor-Aufrufe Java Basics - Anfänger-Themen 4
D Unhandled Exception type IOException in Constructor Java Basics - Anfänger-Themen 1
D The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined Java Basics - Anfänger-Themen 15
B Im Constructor anderen Constructor aufrufen Java Basics - Anfänger-Themen 13
U Implementierung Constructor Java Basics - Anfänger-Themen 7
J Hilfe mit Constructor Java Basics - Anfänger-Themen 3
G The constructor is ambiguous Java Basics - Anfänger-Themen 1
S BufferedWriter undefined constructor Java Basics - Anfänger-Themen 5
I call to super must be first statement in constructor Java Basics - Anfänger-Themen 3
C Ein letzter Fehler mit dem Constructor ! Java Basics - Anfänger-Themen 17
G Constructor & Graphics g Java Basics - Anfänger-Themen 5
N Constructor.isSynthetic() Java Basics - Anfänger-Themen 4
V Problem mit Symbol constructor Java Basics - Anfänger-Themen 5
G constructor auflösen? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben