Java 泛型问题

标签 java api generics google-apps

好吧,我以为我很好地理解了泛型,但出于某种原因,我无法理解为什么这不起作用。我有两个类,或者我应该说 Google 有两个类(我正在尝试实现他们的联系人 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 的调用是完全相同的方法(通过继承),它返回完全相同的东西。也许这与 BasePersonEntry 是一个抽象类有关?

如果有人能对此有所了解,我将非常感激。如果有帮助,您可以在此处找到由 Google 托管的此源代码的完整版本:Link To Google Library Download 。我正在尝试使用他们的 gdata-java 库的 1.41.3 版本。

最佳答案

新定义的问题在于它使用的是Raw类型而不是Generic类型。

结果类型将从所有内容中删除,包括 getCalendarLinks并且其签名减少为相当于 List<Object> getCalendarLinks( )

要修复它,请将声明更改为:

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

注意<?>在 BasePersonEntry 之后。这样它就是泛型类型。

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

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

没有<E>您的编译器(或 IDE)将生成 unchecked警告。

关于Java 泛型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240545/

相关文章:

java - 如何获取 Firebase 中的最后一个节点?

java - dispose() 不起作用。打开新窗口同时关闭另一个窗口

java - 是否可以使用 HQL 编写此 SQL 语句?

ios - 如何使用 AFImageRequestOperation 从 Web 服务器 API 检索图像?

c# - .NET 中泛型参数的数量限制?

generics - 一种处理嵌入一个通用结构的所有结构类型的方法(json 编码)

c# - 获取通用抽象类的属性名

java - JavaFX 无限时间线中的内存泄漏

Google 报亭 API

python - 如何使用 Softlayer Python API 重新启动虚拟机