好吧,我以为我很了解仿制药,但由于某种原因,我无法理解为什么这不起作用。我有两个类,或者我应该说Google有两个类(我正在尝试实现他们的Contacts API)。它们有一个ContactEntry类(缩写如下):
package com.google.gdata.data.contacts;
public class ContactEntry extends BasePersonEntry<ContactEntry> {
public ContactEntry() {
super();
getCategories().add(CATEGORY);
}
public ContactEntry(BaseEntry<?> sourceEntry) {
super(sourceEntry);
}
}
我没有使用一两种方法,但没有什么重要的,它实际上只是其父类BasePersonEntry的一个实现,其中包含大多数重要内容,这些内容涉及下面的人员条目缩写代码:
package com.google.gdata.data.contacts;
public abstract class BasePersonEntry<E extends BasePersonEntry> extends
BaseEntry<E> {
public BasePersonEntry() {
super();
}
public BasePersonEntry(BaseEntry<?> sourceEntry) {
super(sourceEntry);
}
public List<CalendarLink> 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的调用是完全相同的方法(通过继承),它返回与EXACT相同的东西。也许它与BasePersonEntry是一个抽象类有关吗?
如果有人,可以对此有所了解,我将非常感激。如果有帮助,您可以在此处找到由Google托管的此源代码的完整版本:Link To Google Library Download。我正在尝试使用他们的gdata-java库的1.41.3版本。
答案 0 :(得分:2)
您的新定义存在的问题是,它使用原始类型而非通用类型。
结果类型从所有内容中删除,包括getCalendarLinks
,其签名减少到相当于List<Object> getCalendarLinks( )
要解决此问题,请将声明更改为:
public void method1(StringBuilder sb, BasePersonEntry<?> entry)
在BasePersonEntry之后注意<?>
。这种方式是通用类型。
此外,您可能希望将类通用声明更改为
public abstract class BasePersonEntry<E extends BasePersonEntry<E> >
如果没有<E>
,您的编译器(或IDE)将生成unchecked
警告。