Java:如何扣除嵌套泛型类型

时间:2015-11-10 09:42:06

标签: java generics

假设我有课程:

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 ++中,对于具有复杂但强大的元编程可能性的情况,我们有typenametypedef。 Java中有类似的东西吗?

1 个答案:

答案 0 :(得分:2)

我想,这是不可能的。如果您有许多使用Integer作为T的服务,那么您可以定义中间类:

public abstract class IntegerService<S extends BaseDBObject<Integer>> 
                                  extends BaseService<Integer, S>{
    ...
}

并使用public class ConstituentEntityService extends IntegerService<ConstituentEntity>。但是,如果有许多不同的类型用作T,则必须为每种T类型执行此操作。