Java泛型:如何在泛型接口中获取泛型类的ID?

时间:2018-12-02 04:52:51

标签: java generics

我正在使用JDK7。

我有一个抽象类 BaseEntity ,该类使用泛型:

public class BaseEntity<Id extends java.io.Serializable> {
  protected Id id;

  public BaseEntity() {
  }

  public Id getId() {
    return id;
  }
  public void setId(Id id) {
    this.id = id;
  }

  // also has hashCode() and equals() methods to be based on id
}

现在,我想创建一个界面,其类型将为 BaseEntity ,并且我还想要 {{1 }} 在界面中可用。我该怎么办?

我尝试了以下代码:

Id

但我收到2条消息:

  1. 第一个在 BaseEntity 上。消息是:
  

基本实体是原始类型。泛型类型public interface BaseLookup<T extends BaseEntity> { T findById(Id id); } 的引用   应该参数化。

  1. 第二个人在BaseEntity上。错误消息是:
  

Id无法解析为类型。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您必须在BaseEntity中指定BaseLookup的类型。为了提高可读性,我将ID的类型定义为I。 您可以使用以下内容:

class BaseEntity<I extends java.io.Serializable> {
      protected I id;

      public BaseEntity() {
      }

      public I getId() {
        return id;
      }
      public void setId(I id) {
        this.id = id;
      }

      // also has hashCode() and equals() methods to be based on id
}

interface BaseLookup<I extends java.io.Serializable, T extends BaseEntity<I>> {
      T findById(I id);
}

答案 1 :(得分:0)

public interface BaseLookup<Id, T extends BaseEntity<Id>> {
   T findById(Id id);
}

自从参数BaseEntity起,只要引用BaseEntity,就应该始终使用参数。您收到的第一个警告是告诉您您正在使用BaseEntity(不带参数)原始类型,原始类型实际上仅存在于遗留代码中,不应使用。由于表面上BaseEntity不仅是一种类型,而且是整个类型的集合(每个T一个类型),我们需要告诉它哪个 BaseEntity正在扩展,相当于添加了一个额外的通用参数。