2009-11-30 7 views
2

Ma question est très similaire à this question. Je veux être capable d'instancier un objet du type paramètre type, mais aussi sans passer par une "usine". J'ai vraiment besoin d'être contenu dans une seule classe.Instancier un paramètre de type sans passer un objet

public class myClass<E> { 
    E someObject; 

    public myClass(){ 
     someObject = new E(); 
    } 
} 

solutions antérieures nécessaires au constructeur de myClass être changé pour un paramètre d'usine, puis d'appeler le constructeur de cela, mais pour mes besoins, je ne veux pas modifier les appels à myClass de l'extérieur .

Répondre

7

Le problème est que vous ne savez pas ce qu'est E, ni comment le construire. Il pourrait être de n'importe quel type (c'est universally quantified). Vous devez fournir des preuves que, quel que soit E, il peut vraiment être construit. Une «usine» d'un type donné sert de sorte de témoin au fait qu'il peut. Pensez-y une seconde: que se passe-t-il si je réussis Void comme paramètre E? Comment allez-vous construire une valeur de type Void? Etre capable de construire Epour tous E serait comme créer quelque chose à partir de rien. C'est une impossibilité logique. ∀E. E est un ensemble inhabité. Ce que vous voulez vraiment, c'est E pour avoir une borne, ou pour passer un constructeur (usine) comme un témoin du fait que E est dans l'ensemble des objets constructables.

1

Non, comme expliqué dans les réponses à la question liée, vous ne pouvez pas le faire. Modifiez l'interface pour transmettre un objet usine. (NB: Class fait une mauvaise usine.)

0

Vous savez que votre code ne fonctionne pas, et vous attendez une solution avec une syntaxe assez proche.

Que pensez-vous de cela?

//doesn't work. cannot make x.someObject a new String() 
//MyClass<String> x = new MyClass<String>(); 

//this can work... 
MyClass<String> x = MyClass.neu(String.class); 

public class MyClass<E> 
{ 
    static public <T> MyClass<T> neu(Class<T> clazz){...} 
}