Java泛型问题

Java泛型问题,java,api,generics,google-apps,Java,Api,Generics,Google Apps,好吧,我想我对泛型理解得很好,但出于某种原因,我无法理解为什么这不起作用。我有两个类,或者说Google有两个类(我正在尝试实现他们的联系人API)。他们有一个ContactEntry类(缩写如下): 一切正常。它能够解释getCalendarLinks返回CalendarLink类型的列表。但是,如果我想抽象此方法并让我的方法使用BasePersonEntry,如下所示: public void method1(StringBuilder sb, ContactEntry contact) {

好吧,我想我对泛型理解得很好,但出于某种原因,我无法理解为什么这不起作用。我有两个类,或者说Google有两个类(我正在尝试实现他们的联系人API)。他们有一个ContactEntry类(缩写如下):

一切正常。它能够解释getCalendarLinks返回CalendarLink类型的列表。但是,如果我想抽象此方法并让我的方法使用BasePersonEntry,如下所示:

public void method1(StringBuilder sb, ContactEntry contact) {
 if (contact.hasCalendarLinks()) {
  for (CalendarLink calendarLink : contact.getCalendarLinks()) {
   ...
  }
 }
}
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托管的此源代码的完整版本:。我在他们的gdata java库的1.41.3版中尝试了这一点。

新定义的问题是,它使用的是原始类型,而不是通用类型

结果,类型从所有内容中删除,包括
getCalendarLinks
,其签名减少到与
List getCalendarLinks()

若要修复此问题,请将声明更改为:

public void method1(StringBuilder sb, BasePersonEntry<?> entry)
公共作废方法1(StringBuilder sb、BasePersonEntry)
请注意,BasePersonEntry之后的
。这样,它是泛型的

另外,您可能希望将类泛型声明更改为

public abstract class BasePersonEntry<E extends BasePersonEntry<E> >
公共抽象类BasePersonEntry

如果没有
,你的编译器(或IDE)将生成一个
未选中的
警告。

从Shadowcat的最初帖子中,听起来BasePersonEntry是一个Google类,而不是Shadowcat的。没错,我不能影响BasePersonEntry的更改,但是,你提到的其他所有内容都是正确的。我对它进行了测试,并对您建议的方法1进行了修改,结果非常好。我以前只知道泛型应用于集合,而忽略了许多其他应用程序。非常感谢您的回复!我现在正在阅读安吉丽卡·兰格(Angelika Langer)的泛型常见问题解答,似乎我还有很多东西要学@影子猫。我没有注意到BasePersonEntry是一个第三方类,但是在设计泛型基类时,请不要遵循在
extends
语句中使用原始类型的示例(它仍然会产生
未选中的
警告)。享受泛型的乐趣!getRepeatingExtension做什么?这取决于E吗?
public void method1(StringBuilder sb, BasePersonEntry<?> entry)
public abstract class BasePersonEntry<E extends BasePersonEntry<E> >