我得到了以下方法:
protected <S> void setValue(final S oldValue, final S newValue) {
// Do something
}
我想确保这两个参数都是同一类型的。如果在试图传递两种不同类型的参数时出现编译器错误,那就太酷了。
上述方式显然不是正确的。我可以放入String
和Integer
,因为它们都是从Object
扩展而来的。
我的愿望可能吗?或者,确保两个参数都是相同类型的唯一方法是在方法内部进行检查并抛出IllegalArgumentException
吗?
如果您认为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
}
}
这恐怕真的不可能,除非有明确的检查。它总是被强制到Object
;没有办法阻止输入被强制到超类型。
您可以在参数验证中使用基于显式反射的检查,但这只是您的唯一选择。