2015-06-19 18 views
7

Tôi có chức năng đôi khi phải trả lại Date lần khác là DateTime (Joda-Time).Chức năng mẫu 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 
     } 
} 

Đây có phải là phương pháp phù hợp không?
Cách sử dụng?

như thế này (timerHelper là tên của lớp):

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()); 

Và làm thế nào để sử dụng chức năng này để thay thế?

+0

Chỉ tò mò: Điều gì sẽ xảy ra nếu bạn trả về DateTime luôn? –

+0

Không bởi vì trong mã đôi khi tôi cần một 'Date' lần khác một' DateTime' – user72708

+4

Vâng, trong những lúc bạn cần một ngày, hãy gọi 't.toDate()'. – RealSkeptic

Trả lời

2

Đây là một trong những lĩnh vực phức tạp của Generics. Cách duy nhất để làm việc này là lấy tham số Lớp, vì vậy phương thức này biết loại đối tượng cần tạo. Nó không thể biết tại thời điểm này, vì Type Erasure.

Cách khác (đơn giản hơn nhiều) là luôn trả lại DateTime và loại bỏ các generics ở đây.

Khách hàng sẽ luôn biết mình muốn gì và nếu khách hàng muốn Date, nó có thể tạo một từ DateTime dễ dàng hơn nhiều so với những gì bạn đang cố gắng làm.

Ví dụ:

khách hàng 1 muốn một DateTime:

Khách hàng 2 muốn có một Date:

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

tôi nghi ngờ bạn đang quá thông minh cố gắng sử dụng Generics đây. Bởi vì bạn không có đa hình về các loại trả về không có nghĩa là bạn nên dùng đến generics để thử và đạt được hiệu quả đó.

Bạn có thể thực hiện điều này đơn giản như hai phương pháp: public static Date convertToDateForServer(DateTime toSave) {...}public static DateTime convertToDateTimeForServer(DateTime toSave) {...}. Mã gọi có vẻ như biết những gì nó muốn, vì vậy nó chỉ đơn giản có thể gọi phương thức cần thiết. Nếu có thực sự là một phổ biến phức tạp cho cả hai phương pháp, làm cho một phương pháp riêng mà cả hai có thể gọi nội bộ.