2012-12-06 11 views
7

Fondamentalmente solo l'opposto of this question. Voglio convertire un oggetto di classeT > a un oggetto TypeReference <T>.Conversione da Classe <T> a TypeReference <T>

ho provato:

foo(Class<T> valueType) 
{ 
    TypeReference ref = new TypeReference<T>(){}; 
} 

ma che semplicemente restituisce un tipo di riferimento di classe di super-i di classi. Ho anche provato:

foo(Class<T> valueType) 
{ 
    TypeReference ref = new TypeReference<valueType>(){}; 
} 

e

foo(Class<T> valueType) 
{ 
    TypeReference ref = new TypeReference<valueType.getRawClass()>(){}; 
} 

Ma la seconda due non compilare. Come faccio a fare questo?

+0

puoi postare quale classe passi a foo come parametro e cosa ti aspetti di ottenere? – hoaz

risposta

9

È possibile ignorare getType() per riportare il tipo:

new TypeReference<T>(){ 
    @Override 
    public Type getType() { 
     return valueType; 
    } 
}; 
1

voglio convertire un oggetto di classe a un oggetto TypeReference.

Potrebbe essere possibile farlo, ma non riesco a pensare ad alcun problema realistico che risolva. Considerate queste informazioni dal TypeReference javadoc

Questa classe viene utilizzato per passare informazioni complete generici tipo, ed evitare problemi con la cancellazione di tipo (che rimuove sostanzialmente di tipo riferimenti più utilizzabili dagli oggetti runtime Class).

La mia interpretazione di questa è l'unica volta che si utilizzerà TypeReference anziché Class quando si richiedono più informazioni sul tipo che un oggetto Class può fornire. Quindi, anche se riesci a capire come eseguire questa conversione, cosa hai guadagnato? Non è possibile ripristinare le informazioni sul tipo cancellate da una classe in un tipoRiferimento.

Ogni volta che ho una situazione in cui ho bisogno di un TypeReference invece di Class, creo un'istanza di riferimento di tipo concreto e passo quell'oggetto in fase di esecuzione. Qualcosa di simile a questo (non può compilare, ma si ottiene l'idea)

foo(TypeReference<T> refArg) 
{ 
    TypeReference<T> ref = refArg; 
} 

// later on 
object.foo(new TypeReference<List<Set<MyObject>>(){}); 
+2

Mi consente di offrire supporto per entrambi i metodi senza dover riscrivere ogni funzione – Jason

5

Come altri hanno fatto notare, si può ben essere risolvere il problema sbagliato. Quello che potresti voler unificare è in realtà JavaType, perché è quello in cui vengono convertiti entrambi i tuoi input, ed è quello che Jackson usa internamente per tutto. E quindi è possibile avere metodi di convenienza per arrivare a JavaType.

Problemi correlati