我正在使用JDK 7。

我有一个使用泛型的抽象类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,并且我还希望该接口中的IdBaseEntity可用。我怎样才能做到这一点?

我尝试了这段代码:

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


但我收到2条消息:


第一个在BaseEntity上。消息是:



  基础实体是原始类型。泛型类型BaseEntity<Id>的引用
  应该参数化。



第二个是在"Id"上。错误消息是:



  无法将ID解析为类型。


我在这里做错了什么?

最佳答案

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


由于已将BaseEntity参数化,因此在引用BaseEntity时应始终使用参数。您收到的第一个警告是告诉您您正在使用BaseEntity(无参数)原始类型,这实际上只存在于旧代码中,不应使用。因为表面上BaseEntity不仅是一种类型,而且是整个类型集合(每个T一个),所以我们需要告诉它要扩展的BaseEntity,这等于添加了一个附加的泛型参数。

关于java - Java泛型:如何在泛型接口(interface)中获取泛型类的ID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53577513/

10-11 20:53