generics:确保参数类型相同

我有以下方法:

protected  void setValue(final S oldValue, final S newValue) { // Do something } 

我想确保两个参数属于同一类型。 如果在尝试传递两种不同类型的参数时出现编译器错误,那将会很酷。

上述方式显然不正确。 我可以放入一个String和一个Integer ,因为它们都是从Object扩展而来的。

我的想要甚至可能吗? 或者是唯一的方法来确保两个参数都是相同的类型,以检查方法内部并抛出IllegalArgumentException

如果您认为S是正确的类型,您可以这样做:

 protected  void setValue(final S oldValue, final T newValue) { // Do something } 

你可以而且不能输入这些:

 // Works setValue("something", "something"); setValue(new Object(), new String()); // Doesn't work setValue(new String(), new Object()); 

要么

你可以做 :

 protected  void setValue(final S oldValue, final S newValue, final Class clazz) { // Do something } 

并使用它

 setValue("something", "something", String.class); 

要么

 protected  void setValue(final S oldValue, final S newValue) { if(!oldValue.getClass().equals(newValue.getClass())) { //throw something } } 

这是不可能的,我担心,除了明确的检查。 它总是被强迫Object ; 没有办法阻止输入被强制转换为超类型。

您可以在参数validation中使用基于reflection的显式检查,但这只是您唯一的选择。