Вопрос о дженериках Java

Хорошо, я думал, что понял дженерики вполне прилично, но по некоторым причинам я не мог перенести голову, почему это не работает. У меня есть два класса, или я должен сказать, что Google имеет два класса (я пытаюсь реализовать их Контакты API). У них есть класс ContactEntry (сокращенный ниже):

package com.google.gdata.data.contacts;

public class ContactEntry extends BasePersonEntry {

  public ContactEntry() {
    super();
    getCategories().add(CATEGORY);
  }

  public ContactEntry(BaseEntry sourceEntry) {
    super(sourceEntry);
  }

}

Я бросил один или два метода, но ничто важное, его действительно просто реализация его родительского класса BasePersonEntry, который имеет большую часть важного материала, который касается сокращенного кода записи человека ниже:

package com.google.gdata.data.contacts;

public abstract class BasePersonEntry extends
    BaseEntry {

  public BasePersonEntry() {
    super();
  }

  public BasePersonEntry(BaseEntry sourceEntry) {
    super(sourceEntry);
  }

  public List getCalendarLinks() {
    return getRepeatingExtension(CalendarLink.class);
  }

  public void addCalendarLink(CalendarLink calendarLink) {
    getCalendarLinks().add(calendarLink);
  }

  public boolean hasCalendarLinks() {
    return hasRepeatingExtension(CalendarLink.class);
  }

}

Теперь... то, что я не могу вполне понять, - то, если я делаю что-то как следующее:

public void method1(StringBuilder sb, ContactEntry contact) {
 if (contact.hasCalendarLinks()) {
  for (CalendarLink calendarLink : contact.getCalendarLinks()) {
   ...
  }
 }
}

Все хорошо работает. Это может интерпретировать это, getCalendarLinks возвращает список типа CalendarLink. Однако, если я хочу абстрагировать этот метод и иметь мое использование метода BasePersonEntry, как следующее:

public void method1(StringBuilder sb, BasePersonEntry entry) {
 if (entry.hasCalendarLinks()) {
  for (CalendarLink calendarLink : entry.getCalendarLinks()) {
   ...
  }
 }
}

Я получаю ошибку компилятора:

incompatible types
found   : java.lang.Object
required: com.google.gdata.data.contacts.CalendarLink

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

Если бы кто-либо, может пролить некоторый свет на это, я был бы очень обязан. Если помогает, что можно найти полную версию этого исходного кода размещенной Google здесь: Загрузка Библиотеки Google To Ссылки. Я делал попытку этого с версией 1.41.3 их библиотек gdata-java.

1
задан Shadowcat 13 July 2010 в 19:09
поделиться

1 ответ

Проблема с вашим новым определением в том, что оно использует Raw тип, а не Generic тип.

В результате тип стирается из всего, включая getCalendarLinks, а его сигнатура сводится к эквиваленту List getCalendarLinks( )

Чтобы исправить это, измените объявление на:

public void method1(StringBuilder sb, BasePersonEntry<?> entry)

Обратите внимание на после BasePersonEntry. Таким образом, это общий тип.

Также, вероятно, вы захотите изменить объявление класса generic на

public abstract class BasePersonEntry<E extends BasePersonEntry<E> >

Без ваш компилятор (или IDE) выдаст непроверенное предупреждение.

2
ответ дан 2 September 2019 в 23:05
поделиться
Другие вопросы по тегам:

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