2009-07-07 5 views
4

Modifier Comme il y avait beaucoup de downvotes et les gens qui ne comprenaient pas ce que je demande, je vais reformuler ma question:Est-ce que la classe T dans la classe générique <T> est assignable d'une autre classe?

Comment puis-je savoir à l'exécution ce qui est la classe qui a été foo generified de ?

public boolean doesClassImplementList(Class<?> genericClass) 
{ 
    // help me fill this in 
    // this method should return true if genericClass implements List 
    // I can't do this because it doesn't compile: 
    return genericClass instanceof List; 
} 
+0

-1 pour l'affichage d'un exemple qui ne compile pas. Et celui qui pourrait être répondu en deux lignes de code. – kdgregory

+0

Il pourrait être répondu si je connaissais la réponse, mais je ne ai pas et j'ai regardé dans la documentation de classe et n'a pas réussi à le trouver. – ripper234

+0

Il serait répondu si vous avez écrit des exemples compilés. Commencez avec foo = Integer.class et allez à partir de là. – kdgregory

Répondre

9

Class.isAssignableFrom

+0

Je comprends maintenant, c'est vraiment une question idiote. Je pense que ce qui m'a dérouté, c'est le concept de génériques de Java. Je ne suis toujours pas habitué à ça (par opposition à .Nets). – ripper234

0

vous ne pouvez pas en Java (type erasure)

+0

Dites ce que ??????? (SO a besoin d'au moins 15 caractères pour un commentaire). – ripper234

0

Vous devez utiliser Class.forName ("fully_qualified_name") pour générer un objet de classe, ou en utilisant la méthode .getClass() sur un objet déjà instancié. En outre, pour les types int, la classe est définie dans la propriété Integer.TYPE.

J'ai besoin d'un peu plus de clarification de ce que vous essayez de faire, faites correspondre le même type? Vous pouvez utiliser un certain nombre de méthodes, quel est l'objectif final?

Ok, maintenant que vous avez éclairci ... Heres un peu d'aide ... juste passer dans une classe ..

public boolean doesClassImplementList(Class genericClass) 
{ 
    // help me fill this in 
    // this method should return true if genericClass implements List 
    // I can't do this because it doesn't compile: 

    //this will give you a a list of class this class implements 
    Class[] classesImplementing = genericClass.getInterfaces(); 

    //loop through this array and test for: 
    for(int i=0; i<classesImplementing.length; i++) { 
    if (classesImplementing[i].getName().equals("java.util.List")) { 
    return true; 
    } 
    } 
    return false; 
} 
+0

Le questionneur utilise effectivement Integer.class dans la "question". –

+0

Votre réponse fonctionne aussi beaucoup mieux que le mien :) –

+0

Belle boucle. Pourquoi n'avez-vous pas utilisé: List.class.isAssignableFrom (genericClass); au lieu? Tom - Je ne vois aucune référence à Integer.class dans la question. – JeeBee

0

Class<Integer> est une déclaration de type, vous ne pouvez pas l'assigner à une variable , comme vous le faites sur votre première ligne.

Class<Integer> est fondamentalement une manière de référencer le type Integer, donc vous pouvez le passer en paramètre. Cela affecte certaines méthodes (comme le cast) mais c'est fondamentalement un moyen de fournir un paramètre générique à une méthode et de l'associer à un type.

Par exemple:

public <T> T someMethod(Object someObject, Class<T> castTo) { 
    return castTo.cast(someObject); 
} 
Questions connexes