E 'perfettamente bene a dichiarare un metodo con la firma public <T> T getDate()
.
Tuttavia, è impossibile implementare il metodo che restituisce ciò che si desidera. Ciò che un metodo fa in runtime non può dipendere solo dal suo parametro type, perché non conosce il suo parametro type.
Per ottenere un'intuizione per questo, rendersi conto che qualsiasi codice scritto con generici può anche essere scritto in modo equivalente senza l'utilizzo di generici, semplicemente rimuovendo i parametri generici e inserendo i calchi laddove appropriato. Questo è ciò che significa "cancellazione di tipo".
Pertanto, per verificare se il metodo sarebbe possibile in Generics, semplicemente chiedere, come è possibile farlo senza Generics:
public Object getDate()
{
// what would you do here?
}
Date myDate = (Date)getDate();
Se non è possibile farlo senza Generics, non è possibile farlo con Anche i generici.
I modelli C++ sono completamente diversi. Per le funzioni e le classi basate su modelli, i modelli C++ generano una "copia separata" della funzione o della classe per ogni argomento di tipo che viene utilizzato con esso. il compilatore prende il codice basato su modello e lo "copia e incolla" in più versioni, ciascuna separata. Pertanto, ogni copia del codice è specifica per un determinato argomento di tipo e può quindi utilizzare quel tipo in fase di runtime.
Ecco perché è necessario che il codice di codice C++ sia disponibile in formato sorgente per poterlo utilizzare, non esistono modelli "compilati". Tuttavia, in Java, è possibile utilizzare una classe generica compilata. Classi e metodi generici in Java non assumono nulla sui tipi su cui possono essere utilizzati.
che cosa ti compri questo che non potresti realizzare semplicemente lanciando il ritorno più generico a una var più specifica? – amphibient
ha aggiornato la domanda per essere più chiara – Jason