2010-11-11 11 views
7

Ich habe die unten Funktion:Get Art von generischen Typ in einer Liste in Java


    public <T> void putList(String key, List<T> lst){ 
      if (T instanceof String) { 
      // Do something  
      } 
      if (T instanceof Integer) { 
      // Do something 
      } 
    } 

Innerhalb dieser Funktion möchte ich wissen, ob <T> String oder Integer ist so, wenn ich frage mich, es ist ein Weg um seinen Typ zu entdecken? Ich benutzte den obigen Code, aber es erzeugte Fehler

Vielen Dank im Voraus.

+0

der Operator instanceof funktioniert nicht auf T. würden Sie haben tatsächlich ein Element aus der Liste, wie lst zu bekommen. get (0) instanceof String –

Antwort

8

Sie können den Typ T nicht finden, da die Typinformation gelöscht wird. Überprüfen Sie this für weitere Details. Wenn die Liste jedoch nicht leer ist, können Sie ein Element aus der Liste abrufen und können dies mithilfe von instanceof und if else

+4

Angenommen, Sie erhalten ein Element und es ist null, dann instanceof wird Ihnen nicht helfen – newacct

-1

Verwenden Sie den Operator instanceof.

Das heißt, generische Operationen sollten, na ja, generisch sein, also seien Sie vorsichtig beim Ändern des Verhaltens basierend auf dem Typ.

+0

der Operator instanceof arbeitet nicht mit generischen Typparametern wie T –

+0

Sie könnten lst.get [0] instaceof String ... – PaulJWilliams

+0

@Visage das ist ein guter [email protected] Kantamneni sagte das gleiche in seiner Antwort, solange die Liste nicht leer ist –

9

herausfinden. In Java ist dies aufgrund von erasure nicht möglich. Die meisten Leute fügen stattdessen einen Typ-Token hinzu. Beispiel:

public <T> void putList(String key, List<T> list, Class<T> listElementType) { 
} 

Es gibt bestimmte Situationen, in denen die Reflexion an den Typ-Parametern bekommen, aber es ist für Fälle, in denen Sie sich vor den Typ-Parameter haben. Zum Beispiel:

public class MyList extends List<String> { 
    private List<String> myField; 
} 

In diesen beiden Fällen Reflexion kann die Liste bestimmt vom Typ String ist, sondern Reflexion kann es nicht für Ihren Fall bestimmen. Sie müssten einen anderen Ansatz wie einen Typ-Token verwenden.

-1
Type genericType = lst.getType(); 

if(genericType instanceof ParameterizedType){ 
    ParameterizedType aType = (ParameterizedType) genericType; 
    Type[] fieldArgTypes = aType.getActualTypeArguments(); 
    for(Type fieldArgType : fieldArgTypes){ 
     Class fieldArgClass = (Class) fieldArgType; 
     System.out.println("fieldArgClass = " + fieldArgClass); 
    } 
} 
+0

Hallo Neil. danke für deine antwort, aber ich konnte die getType() methode von lst nicht finden. –

+0

Das liegt daran, dass es so etwas nicht gibt. – DJClayworth

1

Es ist nicht möglich, dies zu bestimmen, aufgrund erasure, was bedeutet, dass der Parameter nicht im Code gespeichert ist. Allerdings können Sie entweder einen zusätzlichen Parameter übergeben die festlegen, was die Liste Typ ist:

public <T> void putList(String key, List<T> lst, Class<T> listElementType) { 

}

oder Sie können den Typ jedes Element zur Laufzeit bestimmen:

public <T> void putList(String key, List<T> lst){ 
    for (Object elem:lst) { 
     if (elem instanceof String) { 
     // Do something  
     } 
     if (elem instanceof Integer) { 
     // Do something 
     } 
    } 
} 
1

Generics genannt werden " löscht, "weil sie nur zur Kompilierzeit existieren und vom Compiler entfernt werden. Daher gibt es keine Möglichkeit, den generischen Typ der Sammlung zu bestimmen. Die einzige Möglichkeit, dies für nicht leere Listen zu tun, besteht darin, das erste Element zu nehmen und dessen Typ zu bestimmen.

Dies ist fast die gleiche Lösung, die von DJClayworth vorgeschlagen wurde, aber ich denke, dass es nicht notwendig ist, jedes Element der Liste zu überprüfen. Wenn Sie sicher sind, dass die Liste mit Generika erstellt wird (neue ArrayList() oder neue LinkedList() usw.), ist garantiert, dass alle ihre Elemente vom selben Typ sind.

0

Wenn Sie Funktion des Objekts ausführen möchten, können Sie tun:

public <T> void putList(String key, List<T> lst){ 
for(T object : lst) 
{ 
    if(object instanceof String) { 
     doSomething(((String)object).doForString()) 
    } 
    if(object instanceof Integer) { 
     doSomething(((Integer)object).doForInteger()) 
    } 
} 
Verwandte Themen