10
votes

Spécification d'un type générique en Java à partir de l'objet de la classe

pourquoi c'est faux: xxx

?

est là aucun moyen d'instancier une classe d'un type spécifique donné d'un objet de classe?


Évidemment, je ne ferais jamais cela directement, c'est juste un exemple de montrer ce qui est nécessaire. Dans le code réel, j'ai besoin que je ne connais pas le nom du type. Par exemple xxx


0 commentaires

7 Réponses :


4
votes

Ce n'est pas la façon dont vous utilisez des génériques. Vous n'utilisez pas d'objet code> de classe code>, vous utilisez le nom de la classe directement dans votre code.

ArrayList<Integer> = new ArrayList<>();


2 commentaires

Merci! Mais je suis intéressé par le cas où je ne connais pas le nom de la classe. Mais j'ai cette information dans la classe d'objet


Votre question modifiée rend plus claire ce que vous voulez. Si vous avez l'objet Classe , utilisez la réponse de @ IMPURETABLE.



2
votes

Un ArrayList <> doit avoir un type spécifique qu'il contient. Vous pouvez remplir des objets de ce type ou tout sous-type dans.

Utilisez donc xxx

et vous pouvez mettre entiers

remarquez comment j'ai utilisé l'interface à gauche et la classe à droite du signe égal. C'est une sorte de chose de pratique.

Si vous voulez une liste qui conservera simplement integer (selon votre exemple) la réponse par @Rreputable est votre meilleur pari. Cette réponse conserve entier mais pas seulement entier.


1 commentaires

Merci! Mais je suis intéressé par le cas où je ne connais pas le nom de la classe. Mais j'ai cette information dans la classe d'objet. Voyez si mon édition a fait plus de plus claire



3
votes

Sentez la différence entre Java classe (qui réellement générique aussi) objet et nom de classe.

Vous devez utiliser le nom de la classe spécifiant type générique. P>

public <T extends Number> void createAList(Class<T> type) {
    ArrayList<T> toReturn = new ArrayList<>();
    return toReturn;
}


0 commentaires

9
votes
<T extends Number> ArrayList<T> createAList(Class<T> type)  
{
    ArrayList<T> toReturn = new ArrayList<>();
    return toReturn;
}


ArrayList<Integer> intList = createAList(Integer.class);

4 commentaires

Whoa, ça a fait le tour! La seule chose que je ne suis pas claire, c'est pourquoi ça marche. Avez-vous des liens qui expliquent cela dans de grands détails d'escroc?


@Carknight Cette réponse montre subtilement qu'une telle méthode est totalement inutile. Notez que type n'est même pas utilisé dans son corps.


Oui, mais encore une fois, il s'agit d'un exemple de simplification de la pile-overflow. J'utilise les arguments de type pour créer quelques instances et les renvoyer dans une "liste".


@Carknight alors c'est une question bien différente de ce que vous avez posté. Voir Ma réponse à la question dans sa forme actuelle.



0
votes
public <T extends Number> List<T> createAList (Class<T> type) {
    return new ArrayList<T>();
}

0 commentaires

1
votes

pris littéralement, les autres réponses "suggestions de la manière de mettre en œuvre crééaliste code> ignorons quelque chose d'important: en raison de Type Erasure , une telle méthode est inutile.

donné que vous voulez une liste EXTENEZ NUMÉRO> CODE>, vous pouvez simplement écrire ceci: P>

List<T> lst = new ArrayList<>();


0 commentaires

1
votes

Vous n'avez même pas besoin de passer dans un argument:

ArrayList<Integer> intList = this.<Integer>createAList();


0 commentaires