Un collègue m'a pointé sur un cas étrange en C # (pas si sûr si cela est effectivement étrange cependant). de
Supposons que vous ayez un employé de classe. Si vous souhaitez créer une liste générique de type employé, vous pouvez simplement faire:
Employee x = new Employee(); List<typeof(x)> list = new List<typeof(x)>();
6 Réponses :
Non, l'équivalent de ce n'est pas em> disponible en Java. Vous ne pouvez pas utiliser "x.class" pour obtenir au type déclaré d'une variable. En outre, Les génériques Java ne supporte rien de tel que votre déclaration finale non plus. Si vous croyez qu'ils le font, veuillez donner un échantillon :) p> Qu'est-ce que vous peut em> faire dans c # est d'utiliser le type d'inférence pour faire ce que vous voulez: p> typeof (x) code> ne fonctionne pas dans C # soit pour obtenir le type d'une variable - Il renvoie une référence code> code> pour le nom type em>, par exemple typeof (string) code> retournera une référence à l'objet code> code> associé au type system.string code> type. Cela équivaut à utiliser string.class code> en java. (Notez que, à nouveau, cela applique .Class code> à un nom de type, pas em> nom de variable.) P> public static List<T> CreateListForSampleType<T>(T sample)
{
return new List<T>();
}
...
Employee x = new Employee();
var list = CreateListForSampleType(x);
Exemple de bon code. Que se passerait-il si vous utilisiez typeof code> dans la liste code> variable?
Jon, merci pour votre réponse détaillée! Et comme cela est compilé des informations sur l'heure, alors je suis sur la bonne voie. Parler de savoir s'il est utile ou non est quelque peu controversée cependant;).
Pendant que j'utilise le modèle Jon décrit ici, je n'aime pas cela. Je préférerais de grandement être capable de faire ce que l'OP essayait. Quand j'ai initialement découvert que je devais passer un exemple d'objet, j'ai été attristé.
La raison en est que le typeOf () renvoie un objet de type, tout en ayant besoin d'un nom de type pour initialiser une liste à la compilation. P>
typeof code> est utilisé avec les noms de classe. Utilisez gettype () code> sur un objet, mais uniquement à l'exécution ... p>
Une partie de la réponse est que le type de x n'est pas disponible au moment de la compilation, c'est-à-dire qu'il pourrait être créé à l'aide de quelque chose comme ceci: Vous pouvez cependant créer une liste d'un Classe de base de ce que vous voulez stocker dans la liste (ou même une liste des objets "s). p> p>
Ce qui vous manque - IMHO - est la différence entre une référence de type statique au moment de la compilation et une référence de type Dinamyc (via une instance de System.Type) au moment de l'exécution. P>
typeof () et .getType () vous donne ce dernier. (Pour les types et les instances, respectivement) p>
J'espère que cela rend clair. p>
Le code de Jon Skeet ci-dessus est cool. P>
Vous ne pouvez pas trouver une raison de créer une liste vide depuis C # 3.0.
I Créez généralement des instances de liste uniquement avec une méthode tolistique d'un iNeumable, qui est à son tour générée à l'aide d'une déclaration de rendement, Concat (), une répétition (), Où () etc. P> , p>