Generics: убедитесь, что параметры одного типа - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть следующий метод:

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

Я хочу убедиться, что оба параметра одного типа.Было бы здорово, если бы при попытке передать параметры двух разных типов была бы ошибка компилятора.

Приведенный выше способ явно не правильный.Я могу положить в String и Integer, так как оба простираются от Object.

Возможно ли вообще мое желание?Или это единственный способ убедиться, что оба параметра имеют одинаковый тип, чтобы проверить его внутри метода и выдать IllegalArgumentException?

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Вы можете сделать это, если считаете, что тип 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
    }
}
2 голосов
/ 15 февраля 2012

Боюсь, это не совсем возможно, за исключением явных проверок.Это всегда будет приведено к Object;нет никакого способа остановить приведение входных данных к супертипам.

Вы можете использовать явную проверку на основе отражений в проверке аргументов, но это только ваш единственный вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...