Вопрос по java, generics – Java аргументы универсального типа [дубликаты]

6

На этот вопрос уже есть ответ:

Получите универсальный тип java.util.List 14 ответов

У меня есть метод, который принимаетList<?> как аргумент.

public static String method(List<?> arg){
     // Do something based on type of the list
}

//I call the method as below
List<ClassA> listA = new ArrayList<ClassA>();
List<ClassB> listB = new ArrayList<ClassB>();
method(listA);
method(listB);

Вmethod откуда я знаю, еслиarg этоList ofClassA илиList ofClassB?

Объявление типа параметра как<?> означает именно то, что вы не заинтересованы в фактическом типе. biziclop
Я использовал if (arg.get (0) instanceof ClassA) // что-то делаю .... И я получаю ожидаемые результаты. Bt не уверен, что это будет правильным способом, из ответов здесь. user682765
Вы можете сделать это, даже если вы не использовали дженерики (просто удалите <?>, Чтобы продемонстрировать это). Задача обобщений - сделать так, чтобы вам не приходилось использовать instanceof или беспокоиться о небезопасном приведении. jahroy

Ваш Ответ

1   ответ
4

Romain "Если вы используете <?>, Вы имеете в виду, что вы не собираетесь нигде использовать параметризованный тип. Либо перейдите к определенному типу (в вашем случае это кажется List <String>), либо к очень универсальному List <Object>"

Кроме того, я полагаю, что если вы используете вопросительный знак, компилятор не будет отлавливать несоответствия типов до времени выполнения (reified; стр.119 в Effective Java), обходя стирание и эффективно используя преимущества, которые вы получаете от использования универсальных типов ???

TO ответить на вопрос спрашивающего: если вы используете List <Object>, а затем пытаетесь привести его к A или B, возможно, используя instanceOf, это может быть способом определить, что это такое. Могу поспорить, что есть лучший способ сделать это, чем это.

Похожие вопросы