2013-04-07 18 views
5

Sto usando il framework Mockito mock per deridere una classe generica in Java. L'uso del framework sembra essere abbastanza chiaro dalla documentazione, non ho trovato un esempio per deridere classi generiche. Il quadro finto contiene il seguente metodo:Classi generiche in metodi generici

public static <T> T mock(Class<T> classToMock) { 
    ... 
} 

Ho un tipo generico IState<StateId, Event> e voglio creare un'istanza utilizzando il metodo di cui sopra. Ho provato quanto segue:

IState<StateId, Event> mockState = Mockito.mock(IState.class); 

ricevo il seguente avviso per questo codice:

Type safety: The expression of type IState needs unchecked conversion to conform to IState<StateId,Event> 

Credo di sapere quale sia il problema. Il metodo mock restituisce un tipo di IState, ma la variabile che sto assegnando è un tipo specializzato IState<StateId, Event>, quindi devo in qualche modo dire che la classe che sto creando è specificatamente IState<StateId, Event>, ma non so quale sia la sintassi per questo è. Ho provato i seguenti, ma hanno tutti dato errori di sintassi.

IState<StateId, Event> mockState = Mockito.mock(IState<StateId, Event>.class); 
IState<StateId, Event> mockState = Mockito.mock(IState.class<StateId, Event>); 
+0

Poiché si tratta di un test (presumo a causa di mockito), puoi semplicemente ignorare l'avviso, non c'è 'IState. class' per' .class' –

+0

@RC: Posso farlo, ma io Sono ancora curioso di sapere come gestire queste cose in Java. – petersohn

risposta

1

Generics in java sono implementati tramite cancellazione di tipo. Significa che le classi parametrizzate sono controllate dal compilatore, ma in fase di runtime tutte le classi sono "raw" (per motivi di retrocompatibilità). Una conseguenza di ciò è che esiste un solo oggetto di classe che rappresenta IState e non un numero infinito di classi corrispondenti a tutti i parametri possibili.

Per disabilitare l'avviso, aggiungere @SuppressWarning("unchecked") subito prima della linea.

+0

Giusto. Ma in questo caso, come faccio a sbarazzarmi dell'avvertimento? – petersohn

+0

@petersohn Ho modificato la mia risposta. – WilQu

+0

Questo funziona, tranne che è chiamato '@SuppressWarnings (" unchecked ")' e devo metterlo prima del metodo. Inoltre, non è molto elegante. – petersohn