我有以下方法:
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
}
}
关于java - 泛型:确保参数的类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9299194/