我有一个泛型函数,它接收两个应该属于同一类型的参数。
到目前为止,该功能看起来像这样:
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());
但我希望用户能够立即看到他正在尝试的操作何时不被允许。当他省略该类型的定义时,情况并非如此。
答案 0 :(得分:0)
问题是“应该属于同一类型”究竟是什么意思? Java中的所有引用都是Object
的实例,因此根据定义它们总是“属于同一类型”。由于任何引用类型都是Object
的子类型,因此它应该是:
void copyTo2(Object destination, Object source)
Java中的泛型类型参数旨在提供约束,以便您可以在不进行强制转换的情况下执行某些操作。但是,在这种情况下,你没有类型参数的界限,所以除了T
提供的内容之外,你无法依赖于能够对Object
类型进行任何操作。< / p>