3

Я пишу:

Class<? extends Task> a = n.getClass();

Метод getClass() должен вернуть объект описывающий класс и присвоить его переменной а.

Но вот это часть мне не понятна Class<? extends Task>. Что это за тип переменной такой и куда переменную а теперь вообще можно использовать? Хочу понять как это работает. Помогите разобраться. особенно <? extends Task> знак вопроса убивает здесь что-то общее с тернарной операцией?

JVic
  • 3,309
Pavel
  • 5,327
  • Это дженерики, почитайте про java generics и вам сразу все станет ясно – JVic Nov 13 '16 at 08:21
  • прочтите, если не боитесь английского. Все встанет на свои места. – Roxio0 Nov 14 '16 at 07:33
  • http://ru.stackoverflow.com/questions/361807/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-wildcard-%D0%B2-generics-java Здесь довольно хорошо объяснили – I. Perevoz Nov 14 '16 at 12:29
  • http://ru.stackoverflow.com/questions/588385/%D0%94%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D0%BA%D0%B8-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-wrong-2nd-argument-type так же здесь в ответе очень явно понимается разница между extends и super – I. Perevoz Nov 14 '16 at 12:30

3 Answers3

7

Нет, что вы, нет здесь тернарной операции)) ? extends Object - означает, что здесь может быть любой класс, унаследованный от Object. Вот аналогичная запись:

List<? extends Map<String, String>>
7

Примеры

  • Обозначение типа параметра
public static double sumOfList(List<? extends Number> list) {
  double s = 0.0;
  for (Number n : list)
    s += n.doubleValue();
  return s;
}
public static void printList(List<?> list) {
  for (Object elem: list)
    System.out.print(elem + " ");
    System.out.println();
}  
  • Поле класса и тип возвращаемого значения
public class ClassContainer {
private List<? extends Number> list;

public ClassContainer(List<? extends Number> list){
  this.list = list;
}

public List<? extends Number> getList(){
  return this.list;
}
}
4

В коде где используются обобщённые типы знак вопроса ? называется шаблоном поиска (wildcard) и представляет собой неизвестный тип. Этот символ используется в различных ситуациях:

  • обозначает тип параметра,
  • поля класса или типа локальной переменной,
  • тип возвращаемого значения.

Есть определённые ограничения его применения.

  • О! Спасибо! Это начинает проливать свет на проблему, а нельзя ли примеры добавить? Простите за наглость... как это может выглядеть в этих 3х случаях. – Pavel Nov 13 '16 at 09:37