Domanda

La mia domanda è molto simile alla questa domanda. Voglio essere in grado di creare un'istanza di un oggetto del tipo di parametro type, ma anche senza dover passare in una "fabbrica". Ho davvero bisogno di essere contenuto tutto in una classe.

public class myClass<E> {
    E someObject;

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

Le soluzioni precedenti richiedevano che il costruttore di myClass venisse modificato per avere un parametro factory, e quindi per chiamare il costruttore di quello, ma per i miei scopi non voglio modificare alcuna chiamata a myClass dall'esterno.

È stato utile?

Soluzione

Il problema è che non sai cos'è E , né come costruirlo. Potrebbe essere di qualsiasi tipo (è quantificato universalmente ). Devi fornire la prova che, qualunque sia E , può davvero essere costruito. Una "fabbrica" di un determinato tipo serve come una sorta di testimonianza del fatto che può.

Pensaci un secondo: cosa succede se passo Void come parametro E ? Come vorresti costruire un valore di tipo Void?

Essere in grado di costruire E per tutti E sarebbe come creare qualcosa dal nulla. È un'impossibilità logica. & # 8704; E. E è un set disabitato.

Quello che vuoi davvero è che E abbia un limite o che passi un costruttore (fabbrica) come testimone del fatto che E è nel set di oggetti costruibili.

Altri suggerimenti

No, come spiegato nelle risposte alla domanda collegata, non puoi farlo. Modifica l'interfaccia per passare un oggetto factory. (NB: Class crea una cattiva fabbrica.)

Sai che il tuo codice non funziona e ti aspetti una soluzione con una sintassi abbastanza vicina.

Che ne dici di questo?

//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){...}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top