我正在使用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
,并且我还希望该接口中的Id
的BaseEntity
可用。我怎样才能做到这一点?我尝试了这段代码:
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/