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的显式检查,但这只是您唯一的选择。