【发布时间】:2014-04-15 14:38:34
【问题描述】:
我有一个通用函数,它接收两个应该属于同一类型的参数。
到目前为止,函数看起来像这样:
void <T> copyTo1(Class<T> type, T destination, T source) {
// Do stuff
}
这很好用,但我认为这不是实现我的目标的正确方法,因为函数中不会使用类型。所以我寻找了另一种解决方案并想出了这个:
void <T, S extends T> copyTo2(T destination, S source) {
// Do stuff
}
这两个函数允许的调用类型如下所示:
copyTo1(Object.class, new Object(), new Object()); // Okay
copyTo1(Object.class, new Object(), new String()); // Okay
copyTo1(Object.class, new String(), new Object()); // Okay
copyTo1(String.class, new String(), new String()); // Okay
copyTo1(String.class, new String(), new Date()); // Not okay
copyTo2(new Object(), new Object()); // Okay
copyTo2(new Object(), new String()); // Okay
copyTo2(new String(), new Object()); // Not okay
copyTo2(new String(), new Date()); // Not okay
第二种选择更严格,这对我来说非常好。
现在的问题是:应该首选哪种方法?还是还有一个我没看到?
非常感谢。
仅作记录:我知道我可以像这样定义和使用函数...
void <T> copyTo(T destination, T source) {
// Do stuff
}
...
this.<String> copyTo(new String(), new String());
但我希望用户立即看到他正在尝试的操作何时不允许。当他省略类型的定义时,情况并非如此。
【问题讨论】:
-
IMO 不是关于最佳实践,而是关于要求。您希望
destination和source之间有什么样的关系,请相应地使用类型参数。 -
@RohitJain 我同意,选择最适合的那个。如果更严格的方法有效,那就去吧!
-
我忘了说
type在具体实现中不会用到。 -
我更喜欢第二种选择,但这最终是具体要求的问题。
-
@LeonardBrünings 我选择了第二个版本。