generischen Typ prüfen

  • Themenstarter Themenstarter budili
  • Beginndatum Beginndatum
B

budili

Gast
Hallo Leute,

ich wollte folgenden Code schreiben:

[Java]
public abstract class TestClient<T>
{
public final boolean isUsing(final List<Object> items)
{
for (final Object object : items)
{
if (object instanceof T)
{
doYourJob();
}
}
return false;
}
}
[/Java]

Leider funktioniert der o.g. Code nicht. Der Compiler meckert mir folgende Zeile an:
Code:
if (object instanceof T)
mit folgender Fehlermeldung: Cannot perform instanceof check against type parameter T. Use instead its erasure Object instead since further generic type information will be erased at runtime.

Der Compiler meckert wahrscheinlich, weil T zur Laufzeit alles sein kann und er es wohl nicht prüfen kann. Mir ist nur nicht ganz klar, wie ich das lösen könnte.

Gibt es überhaupt eine Möglichkeit zur Laufzeit den generischen Typ zu prüfen?
Hat jemand einen Tipp?

Gruß
Tim
 
Zuletzt bearbeitet von einem Moderator:
T ist nur Luft, existiert nach dem Kompilieren nicht mehr, daher für instanceof nicht geeignet,
du könntest im Konstruktor verlangen, dass ein T-Objekt oder Class<T> übergeben wird, damit hättest du was (virtuell) handefestes, um Vergleiche anzustellen
 
ich denke du hast recht, dass T iwas sein kann...
schick vlt. ein Objekt von T als Parameter mit, damit der Compiler weiß, dass der typ von t definiert ist....

lg


// Mist immer zu spät...
 
Zuletzt bearbeitet:
Wenn du als Übergabewert nur T zulässt wird es zur Laufzeit überprüft:

Java:
	public final void doSomething(final T test) {
	}
 
ähh, eher nur zur Kompilierzeit, und auch dann nur wenn der Aufrufer so nett ist, das zu beachten 😉

Java:
List<String> list = new ArrayList<String>();
List list2 = list;
list2.add(Integer.valueOf(42)); // erlaubt zur Kompilierzeit und zur Laufzeit
String x = list.get(0); // erlaubt zur Kompilierzeit, ClassCastException zur Laufzeit
 
Ich hab noch nicht ganz verstanden wie Ihr das meint, ich habe nun folgendes ausprobiert:

[Java]
public Test(final Class<T> test)
{
this.test = test;
}
[/Java]

Nun habe ich in test diesen Generic, aber wie vergleiche ich nun?
Mit
Code:
instanceof
funktioniert das doch nach wie vor nicht. Oder?
 
Java:
Class test = ..;
if (test.isInstance(x))
if (test.isAssignableFrom(x))
if (test == x.getClass())
schau in der API zu Class nach, was die entsprechenden Methoden leisten,
bzw. probiere sie aus,
bei nur gleichen Klassen kannst du direkt vergleichen, bei Vererbung wirds etwas spannender was alles erlaubt sein soll
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben