Generics - Юридическая альтернатива для (элементы instanceof List <? Extends Comparable>) - PullRequest
8 голосов
/ 07 августа 2011

У меня есть этот метод, уникальный параметр которого (List elements) устанавливает элементы в ListModel, но мне нужно сделать проверку, чтобы убедиться, что универсальный тип реализует сопоставимый, и поскольку такая вещь, как:

if (elements instanceof List<? extends Comparable>)

незаконно, я не знаю, как сделать правильную проверку.

Обновление

Я уже сделал эту проверку, используя:

(elements.size() > 0 && elements.get(0) instanceof Comparable)

, но я хочу знать, еслиЕсть ли более чистое решение для этого, например, с помощью отражения?

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 07 августа 2011

Общий тип списка: стирается во время выполнения .Чтобы это работало, вам нужно либо указать параметр в сигнатуре метода, либо протестировать каждый элемент отдельно.

public void doSomething(List<? extends Comparable> elements) {}

ИЛИ

for (Object o : elements) {
    if (o instanceof Comparable) {}
}

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

2 голосов
/ 07 августа 2011

Это невозможно. instanceof - оператор времени выполнения, тогда как общая информация теряется во время выполнения (стирание типа).

1 голос
/ 08 августа 2011

К вашему обновлению: просто убедиться, что один элемент реализует Comparable, недостаточно (что, если другие не делают?) И убедиться, что все элементы реализуют Comparable, также недостаточно для проверки (что, если они различных классов, которые реализуют Comparable, но не могут сравнивать друг с другом?).

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

1 голос
/ 07 августа 2011

Я не гуру Generics, но, насколько я понимаю, причина, по которой вы не можете этого сделать, заключается в том, что во время выполнения нет никакого различия между ArrayList и, скажем, ArrayList<String>. Так что уже слишком поздно проводить желаемый тест.

Почему бы просто не объявить, что ваш метод принимает List<? extends Comparable> вместо List?

В частности, то, как вы сформулировали свой вопрос, заставляет его звучать так, как будто вы ожидаете, что список всегда содержит однородные элементы, но простой старый List не дает вам какой-либо гарантии подобного .

...