2013-05-23 11 views
9

Ho un'interfaccia che verrà implementata da diverse classi diverse, ciascuna con tipi e tipi di ritorno diversi. Il tipo di ritorno può essere dedotto dal tipo generico del metodo, ma ho problemi ad implementarlo.Come restituire un tipo concreto quando si implementa un'interfaccia generica

L'interfaccia assomiglia a questo momento:

public interface TransformUtilsBase<T> { 

    Class<?> transformToNhin(T request, BrokerContext brokerContext); 
} 

voglio la classe Impl per assomigliare:

public class TransformUtilsXCPD implements TransformUtilsBase<foo> { 

    bar transformToNhin(foo request, BrokerContext brokerContext) { 
     code here 
    } 

Nel impl ho so quale il tipo di ritorno dovrebbe essere. A livello di interfaccia non c'è modo di dirlo.

Potrei semplicemente rinunciare a un'interfaccia tutti insieme, e creare solo più classi con gli stessi nomi di metodo, ma volevo formalizzarlo, dato che si stanno tutti abituando allo stesso scopo. Solo i tipi sono diversi.

Oppure potevo semplicemente avere una grande classe di metodi statici dal momento che sono operazioni util, ma stava diventando ingombrante gestire una classe con così tanti metodi con lo stesso nome e tutti i metodi helper necessari (di nuovo tutti con il stesso nome).

L'implementazione di un'interfaccia sembra l'opzione migliore per formalizzare la funzionalità, anche se non sono in grado di eseguire metodi statici. Non riesco proprio a capire come gestire i tipi di ritorno.

modifica: espansione su interfaccia per mostrare l'esempio completo per evitare ulteriore confusione. Interface

public interface TransformUtilsBase<T, U> { 
    Class<?> transformToNhin(T request, BrokerContext brokerContext); 
    Class<?> transformToXca(U request, BrokerContext brokerContext); 
} 

Impl

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, Bar> { 
    Baz transformToNhin(Foo request, BrokerContext brokerContext) { code here } 
    Biz transformToXca(Bar request, BrokerContext brokerContext) { code here } 
} 
+0

Stai cercando di restituire la classe reale Baz, o un'istanza di Baz? La tua modifica implica che potrebbe essere il secondo. – Alex

+0

Buon punto. Sto cercando di restituire un'istanza specifica della classe Baz, creata durante il processo di trasformazione. La notazione con caratteri jolly è il modo migliore in cui ho saputo esprimere la mia intenzione di fornire generici solo per le variabili del metodo, che il tipo di ritorno può essere determinato da. –

risposta

12

Perché non dichiarano il tipo per il ritorno tipo così, qualcosa di simile

public interface TransformUtilsBase<T, S> { 

    S transformToNhin(T request, BrokerContext brokerContext); 
} 

si può anche "legare" il ritorno digitare per essere di tipo specifico (ad esempio Bar)

public interface TransformUtilsBase<T, S extends Bar> { 

    S transformToNhin(T request, BrokerContext brokerContext); 
} 

e le classi che implementano dichiarerà come

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, BarImpl> { 

    BarImpl transformToNhin(Foo request, BrokerContext brokerContext) { 
     //code here 
    } 
} 

dove BarImpl è una sottoclasse di Bar

+0

Nitpick: la parte 'S extends Class' non ha molto senso con l'esempio finale, dato che' Bar' non può certamente estendere 'Class'. Vorrei solo usare qualcosa oltre a 'Class' come limite superiore di esempio - Penso che l'OP fosse confuso quando scrisse quello. –

+0

grazie @PaulBellora ho rimosso il 'Class' come limite superiore e dato qualche altro esempio – sanbhat

+0

Sembra fantastico! +1 –

Problemi correlati