假设我有课程:
public interface ObjectWithId<T> {
T getId();
void setId(T id);
}
public class BaseDBObject<T> implements ObjectWithId<T> {
// Common fields:
private T id;
private String createdBy;
...
}
一个具体的事实:
public class ConstituentEntity extends BaseDBObject<Integer> {
...
}
然后我创建了一些服务,该服务也称为? extends BaseDBObject
的通用参数,并且在某些方法中应该使用适当类型的id
。
现在它实现了双重泛型:
abstract public class BaseService<IdT,T extends BaseDBObject<IdT>> {
public T getById(IdT id){
return getDao().getById(id);
}
}
public class ConstituentEntityService extends BaseService<Integer, ConstituentEntity>{
...
}
但是再看一下最后的定义。我知道ConstituentEntity
已经拥有Integer
作为他们的密钥持有者,所以对我来说这似乎是丑陋的再次提供服务类型。
我看起来有可能写下一个结构:
abstract public class BaseService<T extends BaseDBObject> {
public T getById(??T.T?? id){
return getDao().getById(id);
}
}
在C ++中,对于具有复杂但强大的元编程可能性的情况,我们有typename
和typedef
。
Java中有类似的东西吗?
答案 0 :(得分:2)
我想,这是不可能的。如果您有许多使用Integer
作为T
的服务,那么您可以定义中间类:
public abstract class IntegerService<S extends BaseDBObject<Integer>>
extends BaseService<Integer, S>{
...
}
并使用public class ConstituentEntityService extends IntegerService<ConstituentEntity>
。但是,如果有许多不同的类型用作T
,则必须为每种T
类型执行此操作。