Хорошо, я думал, что понял дженерики вполне прилично, но по некоторым причинам я не мог перенести голову, почему это не работает. У меня есть два класса, или я должен сказать, что 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.
Проблема с вашим новым определением в том, что оно использует Raw тип, а не Generic тип.
В результате тип стирается из всего, включая getCalendarLinks
, а его сигнатура сводится к эквиваленту List
Чтобы исправить это, измените объявление на:
public void method1(StringBuilder sb, BasePersonEntry<?> entry)
Обратите внимание на >
после BasePersonEntry. Таким образом, это общий тип.
Также, вероятно, вы захотите изменить объявление класса generic на
public abstract class BasePersonEntry<E extends BasePersonEntry<E> >
Без
ваш компилятор (или IDE) выдаст непроверенное
предупреждение.