L'instanciation d'un objet de paramètre de type
J'ai une classe de modèle comme suit:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); //gives compiler error
}
}
Comment puis-je créer une nouvelle instance de T dans ma classe?
OriginalL'auteur Mercurious | 2008-11-18
Vous devez vous connecter pour publier un commentaire.
Après le type d'effacement, de tout ce qui est connu au sujet de
T
est que c'est une sous-classe deObject
. Vous devez spécifier une usine à créer des instances deT
.On pourrait utiliser un
Fournisseur<T>
:Utilisation pourrait ressembler à ceci:
Alternativement, vous pouvez fournir un
Class<T>
objet, puis utiliser la réflexion.Supplier
est situé dans? "MyClass(Classe<? s'étend T> impl)` doit déclarer "lance NoSuchMethodException" pour être compilé. Votre réponse est malheureusement pas très sympa pour Java débutant.@user927387
java.util.function.Supplier
Fournisseur<T> nécessite Java 8, JFTR l'endroit où vaut la peine.
OriginalL'auteur erickson
Un autre non-réfléchissant approche consiste à utiliser un Générateur hybride /Abstract Factory modèle.
Effective Java, Joshua Bloch va sur le Générateur de modèle dans le détail, et les défenseurs d'un générique Builder interface:
Béton constructeurs pouvez implémenter cette interface, et à l'extérieur de classes peuvent utiliser le béton builder afin de configurer le Constructeur est nécessaire. Le constructeur peut être passé à MyClass comme un
Builder<T>
.L'aide de ce modèle, vous pouvez obtenir de nouvelles instances de
T
, même siT
a les paramètres du constructeur ou nécessite une configuration supplémentaire. Bien sûr, vous aurez besoin d'une façon de passer le Constructeur dans Maclasse. Si vous ne pouvez pas passer n'importe quoi dans Maclasse, puis le Constructeur et l'Abstract Factory.OriginalL'auteur
Cela peut être plus lourd que ce que vous cherchez, mais il fonctionne aussi. Notez que si vous prenez cette approche, il serait plus judicieux d'injecter de l'usine en MyClass quand il est construit à la place de la passer dans votre méthode à chaque fois qu'il est appelé.
Bonne appelez - vous aurez envie de mettre un délimitée générique sur l'usine pour permettre aux objets de type T et sous-classes de T à être créé dans myMethod().
OriginalL'auteur Dan Hodge
Si vous êtes prêt à la sous-classe, vous pouvez éviter l'effacement ainsi, découvrez
http://www.artima.com/weblogs/viewpost.jsp?thread=208860
OriginalL'auteur krosenvold
Le meilleur et facile solution ici pour utiliser la conversion.Ouais, c'est semble laid, mais mieux que j'ai vu ici.
OriginalL'auteur Mike Adamenko
Classe classOfT
OriginalL'auteur Kevendra