为通用功能强制执行相同类型(最佳实践)

时间:2014-04-15 14:38:35

标签: java generics methods

我有一个泛型函数,它接收两个应该属于同一类型的参数。

到目前为止,该功能看起来像这样:

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

但我希望用户能够立即看到他正在尝试的操作何时不被允许。当他省略该类型的定义时,情况并非如此。

1 个答案:

答案 0 :(得分:0)

问题是“应该属于同一类型”究竟是什么意思? Java中的所有引用都是Object的实例,因此根据定义它们总是“属于同一类型”。由于任何引用类型都是Object的子类型,因此它应该是:

void copyTo2(Object destination, Object source)

Java中的泛型类型参数旨在提供约束,以便您可以在不进行强制转换的情况下执行某些操作。但是,在这种情况下,你没有类型参数的界限,所以除了T提供的内容之外,你无法依赖于能够对Object类型进行任何操作。< / p>