我有一个函数,它有时必须返回< 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());
}
这是泛型的棘手领域之一。使其发挥作用的唯一方法是采用Class参数,因此该方法知道要创建什么类型的对象。由于类型擦除,它目前无法知道。
或者(简单得多)总是返回DateTime
,并在这里去掉泛型。
客户端总是知道它想要什么,如果客户端想要一个Date
,它可以从DateTime
中创建一个,这比您尝试做的要容易得多。
例:
客户端1需要日期时间
:
DateTime result = service.convertTimeForServer(dt);
客户端 2 需要一个日期
:
Date result = service.convertTimeForServer(dt).toDate();
如果Java 8可用,您可以使用新的可选类来实现。
我怀疑你在这里试图使用泛型太聪明了。因为返回类型没有多态性,并不意味着你应该求助于泛型来尝试实现这种效果。
您可以简单地将其实现为两个方法: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:注:候选人是: