我有以下方法:
protected <S> void setValue(final S oldValue, final S newValue) {
// Do something
}
我想确保两个参数属于同一类型。如果在尝试传递两种不同类型的参数时出现编译器错误,那将会很酷。
上述方式显然不正确。我可以加入String
和Integer
,因为它们都来自Object
。
我想要的甚至可能吗?或者是确保两个参数属于同一类型的唯一方法,以便在方法内检查它并抛出IllegalArgumentException
?
答案 0 :(得分:5)
如果你认为S是正确的类型,你可以这样做:
protected <S, T extends S> 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 <S> void setValue(final S oldValue, final S newValue, final Class<S> clazz) {
// Do something
}
并像那样使用
setValue("something", "something", String.class);
或
protected <S> void setValue(final S oldValue, final S newValue) {
if(!oldValue.getClass().equals(newValue.getClass())) {
//throw something
}
}
答案 1 :(得分:2)
这是不可能的,我担心,除了明确的检查。它总是会被强迫Object
;没有办法阻止输入被强制转换为超类型。
您可以在参数验证中使用基于反射的显式检查,但这只是您唯一的选择。