Java模板功能

时间:2015-06-19 13:29:16

标签: java generics

我有一个函数有时必须返回Date其他时间DateTime(Joda-Time)。

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
        }
}

这是正确的做法吗? 怎么用?

像这样(timerHelper是类的名称):

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

如何使用此功能?

static public <T extends Object> T current_Moment(){
        return convertTimeForServer(new DateTime());
    }

3 个答案:

答案 0 :(得分:5)

我怀疑你在这里尝试使用泛型是太聪明了。因为你没有返回类型的多态性并不意味着你应该求助于泛型来尝试实现这种效果。

您可以将其简单地实现为两种方法:public static Date convertToDateForServer(DateTime toSave) {...}public static DateTime convertToDateTimeForServer(DateTime toSave) {...}。调用代码似乎知道它想要什么,所以它可以简单地调用所需的方法。如果这两种方法确实存在复杂的共性,那么创建一个可以在内部调用的私有方法。

答案 1 :(得分:2)

如果Java 8可用,您可以使用新的Either类实现Optional

答案 2 :(得分:2)

这是泛型的棘手领域之一。使其工作的唯一方法是采用Class参数,因此该方法知道要创建的对象类型。由于Type Erasure,它现在无法知道。

或者(更简单)总是返回DateTime并在此处取消泛型。

客户端将始终知道它想要什么,如果客户想要Date,它可以从DateTime创建一个比您尝试做的更容易。

示例:

客户1需要DateTime

DateTime result = service.convertTimeForServer(dt);

客户2需要Date

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