我正在使用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条消息:
BaseEntity
上。消息是:基本实体是原始类型。泛型类型
public interface BaseLookup<T extends BaseEntity> { T findById(Id id); }
的引用 应该参数化。
BaseEntity
上。错误消息是:Id无法解析为类型。
我在这里做错了什么?
答案 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
正在扩展,相当于添加了一个额外的通用参数。