当前位置: 首页 > 知识库问答 >
问题:

Java模板函数

谯嘉木
2023-03-14

我有一个函数,它有时必须返回< code>Date,有时必须返回< code>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
    }
}

这是正确的方法吗?< br >如何使用?

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

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

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个答案

卫沈义
2023-03-14

这是泛型的棘手领域之一。使其发挥作用的唯一方法是采用Class参数,因此该方法知道要创建什么类型的对象。由于类型擦除,它目前无法知道。

或者(简单得多)总是返回DateTime,并在这里去掉泛型。

客户端总是知道它想要什么,如果客户端想要一个Date,它可以从DateTime中创建一个,这比您尝试做的要容易得多。

例:

客户端1需要日期时间

DateTime result = service.convertTimeForServer(dt);

客户端 2 需要一个日期

Date result = service.convertTimeForServer(dt).toDate();
宗政昱
2023-03-14

如果Java 8可用,您可以使用新的可选类来实现。

申屠昆
2023-03-14

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

您可以简单地将其实现为两个方法:public静态Date转换器ToDateForServer(日期时间保存){...}public静态DateTime转换器ToDateTimeForServer(日期时间保存){...}。调用代码似乎知道它想要什么,因此它可以简单地调用所需的方法。如果这两种方法确实存在复杂的共性,请创建一个两者都可以在内部调用的私有方法。

 类似资料:
  • 我想知道如果函数的模板参数包括但不限于类的模板参数,如何使函数成为类的朋友并在类外定义函数。 例如,我有以下模板类和模板朋友函数: 如果我编译: 我会得到以下链接器错误:

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • beego 支持用户定义模板函数,但是必须在 beego.Run() 调用之前,设置如下: func hello(in string)(out string)\{ out = in + "world" return \} beego.AddFuncMap("hi",hello) 定义之后你就可以在模板中这样使用了: \{\{.Content | hi\}\} 目前 beego

  • 重载函数通常是基于不同的数据类型完成类似的操作。如果对每种数据类型的操作是相同的,那么用函数模扳完成这项工作更为简洁和方便。程序员对函数模板的定义只编写一次。基于调用函数时提供的参数类型,C++自动产生单独的目标代码函数来正确地处理每种类型的调用。 在C浯言中,这个任务是用预处理指令#define建立的宏完成的(见第17章)。但是,宏可能会产生副作用,并且使编译器不能进行类型检查。函数模板和宏一样

  • 重载函数通常用于不同数据类型用不同程序逻辑进行类似的操作。如果每种数据类型的程序逻辑和操作相同.那么用函数模板(fuction template)完成这项工作更加简洁和方便。程序员编写一个函数模板定义。根据函数调用中提供的参数类型,C++ 自动产生不同模板函数 (template function) 来处理不同类型的调用。这样,定义一个函数模板即可定义一系列的解决方案。 所有的函数模板定义都是以关

  • 如果我没有理解错的话,类模板定义了一个函数,所以当我调用时,编译器有可能进行隐式强制转换,但是在函数模板的情况下,此时没有函数定义,所以隐式强制转换不会发生。 但我不明白为什么编译器不能创建函数定义,然后应用隐式强制转换? 错误是: 在函数“int main()”中:    25:24:错误:调用“test2::add(void(&)(int))”没有匹配函数    25:24:注:候选人是: