泛型:确保参数类型相同

时间:2012-02-15 18:34:34

标签: java generics methods parameters

我有以下方法:

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

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

上述方式显然不正确。我可以加入StringInteger,因为它们都来自Object

我想要的甚至可能吗?或者是确保两个参数属于同一类型的唯一方法,以便在方法内检查它并抛出IllegalArgumentException

2 个答案:

答案 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;没有办法阻止输入被强制转换为超类型。

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