2015-06-19 9 views
7

Ho una funzione che a volte deve restituire un Date altre volte a DateTime (Joda-Time).Funzione modello Java

static public <T extends Object> T convertTimeForServer(DateTime toSave) { 
     DateTime temp = null; 
     try { 
      temp = toSave.withZone(DateTimeZone.forID(getServerTimeZone())); 
     } catch (Exception e) { 
     } 

     T toReturn = null; 
     if (toReturn.getClass().equals(temp)) { 
      return (T) temp;//Return DATETIME 
     } else { 
      return (T) temp.toDate();//Return DATE 
     } 
} 

È l'approccio giusto?
Come si usa?

come questo (timerHelper è il nome della classe):

DateTime t = timerHelper.<DateTime>convertTimeForServer(new DateTime()); 
    Date t2 = timerHelper.<Date>convertTimeForServer(new DateTime()); 
    or 
    DateTime t = (DateTime)timerHelper.convertTimeForServer(new DateTime()); 
    Date t2 = (Date)timerHelper.convertTimeForServer(new DateTime()); 

E come utilizzare questa funzione invece?

+0

Solo curioso: cosa succede se restituisci sempre DateTime? –

+0

No, perché nel codice a volte ho bisogno di un 'Date' altre volte a' DateTime' – user72708

+4

Bene, in quei momenti in cui hai bisogno di una data, chiama 't.toDate()'. – RealSkeptic

risposta

2

Questa è una delle aree difficili di Generics. L'unico modo per farlo funzionare è quello di prendere un argomento di classe, in modo che il metodo sappia quale tipo di oggetto creare. Al momento non può sapere, a causa di Type Erasure.

In alternativa (molto più semplice) è sempre restituire DateTime e fare qui con generici.

Il client saprà sempre cosa vuole e se il client desidera un Date, può crearne uno da DateTime molto più facilmente di quello che si sta tentando di fare.

Esempio:

client 1 vuole un DateTime:

client 2 vuole un Date:

Date result = service.convertTimeForServer(dt).toDate(); 
5

Ho il sospetto che tu sia troppo intelligente cercando di utilizzare farmaci generici qui. Perché non hai il polimorfismo sui tipi di ritorno non significa che dovresti ricorrere ai generici per cercare di ottenere quell'effetto.

È possibile implementare questo semplicemente come due metodi: public static Date convertToDateForServer(DateTime toSave) {...} e public static DateTime convertToDateTimeForServer(DateTime toSave) {...}. Il codice chiamante sembra sapere cosa vuole, quindi può semplicemente chiamare il metodo necessario. Se esiste una complessa comunanza con entrambi i metodi, crea un metodo privato che entrambi possono chiamare internamente.

Problemi correlati