Ich versuche, eine Variable
Klasse zu erstellen, die entweder einen Integer
oder Double
Wert mit Generics darstellen kann.Java-Generics mit statischen Factory-Methoden
Unten ist der Code, den ich ausprobiert habe. Wegen der Löschung verwende ich eine enum
, um den beabsichtigten Typ des Variable
zu speichern und dann zu versuchen, diesen zu verwenden, um den Wert auf den richtigen Typ zu initialisieren.
public class Variable<T> {
private enum Type {INTEGER, DOUBLE};
private Type type;
private T value;
public static Variable<Integer> createAsInteger() {
return new Variable<Integer>(Type.INTEGER);
}
public static Variable<Double> createAsDouble() {
return new Variable<Double>(Type.DOUBLE);
}
private Variable(Type type) {
this.type = type;
if(type == Type.INTEGER) {
value = new Integer(0);
} else {
value = new Double(0.0);
}
}
public static void main(String[] args) {
Variable.createAsInteger();
Variable.createAsDouble();
}
}
Allerdings, wenn ich es kompilieren bekomme ich folgende Meldung ...
error: incompatible types: Integer cannot be converted to T
value = new Integer(0);
und ebenfalls für die Double
.
Kann jemand erklären, warum dies geschieht und ob es einen Weg gibt, ohne zwei separate Klassen zu schreiben, eine für Integer
und eine für Double
?
bearbeiten
Vielen Dank für Ihre Antworten ... basierend auf sie, ich weiß jetzt, es gibt bessere Möglichkeiten, dies zu tun. Ich versuche jedoch herauszufinden, warum dieser Ansatz nicht funktioniert, damit ich in Zukunft nicht denselben Fehler mache.
Wenn ich meine Klasse als public class Variable<T extends Number>
wie vorgeschlagen definiere, bekomme ich immer noch den gleichen Fehler.
Sie brauchen nicht wirklich 'Class clazz', wenn Sie die Klassenvariable nicht überprüfen werden. 'static Variable create()' funktioniert. –
@AndyTurner du hast natürlich Recht. Der 'clazz'-Parameter ist nur dazu da, um genau zu steuern, was die' Nummer' sein kann oder nicht. Ich werde die Antwort jedoch bearbeiten. – Mena
Ich bin nicht auf die zwei Sätze von Diamantoperatoren in einer Methodenanweisung vorhin gestoßen, d. H. ' Variable '. Kannst du Links empfehlen, wo ich mehr darüber lesen kann? –
soarjay