# generischen Typ prüfen



## budili (1. Mrz 2011)

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: 
	
	
	
	





```
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


----------



## SlaterB (1. Mrz 2011)

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


----------



## Simon_Flagg (1. Mrz 2011)

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...


----------



## Andi_CH (2. Mrz 2011)

Wenn du als Übergabewert nur T zulässt wird es zur Laufzeit überprüft:


```
public final void doSomething(final T test) {
	}
```


----------



## SlaterB (2. Mrz 2011)

ähh, eher nur zur Kompilierzeit, und auch dann nur wenn der Aufrufer so nett ist, das zu beachten 


```
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
```


----------



## budi (2. Mrz 2011)

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 
	
	
	
	





```
instanceof
```
 funktioniert das doch nach wie vor nicht. Oder?


----------



## SlaterB (2. Mrz 2011)

```
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


----------



## budi (2. Mrz 2011)

Ah cool ! 

Danke!


----------

