java通用通配符

时间:2009-12-16 12:02:43

标签: java generics

目前我正在开发一个服务接口,它根据主键检索域对象。但是我觉得我没有有效地使用泛型。

基本域对象如下所示:

public interface DomainObject<PK extends Serializable> extends Serializable {
    PK getID();
}

我的服务界面如下所示:

public interface LoadService<T extends DomainObject<PK>, PK extends Serializable> {
    T load(PK ID);
}

这是有效的,但是我必须在服务泛型中指定PK类型,即使在T中已经知道PK类型。有什么办法可以在LoadService接口中再次定义我的PK吗?类似的东西:

LoadService<T extends DomainObject<? extends Serializable as PK> { ... }

非常感谢帮助!

2 个答案:

答案 0 :(得分:1)

由于您在'LoadService'中使用PK类,因此无法避免这种情况。我的意思是你可以定义像

这样的服务
interface LoadService<T extends DomainObject<?>> {
    void store(T data);
}

但是,如果您使用PK类,那么这不是选项,因为编译器会检查PK类型是否与域对象类型兼容。

另一个选择是从 DomainObject 中删除类型参数,即执行以下操作:

interface DomainObject extends Serializable {
    Serializable getID();
}

答案 1 :(得分:0)

尝试对type参数使用多个边界,如果T扩展DomainObject并实现Serializable

interface LoadService<T extends DomainObject<T> & Serializable> {
}