是否有可能在通用性中引入通用性?

时间:2010-12-19 15:29:50

标签: java generics type-erasure

对不起该瓷砖......我不知道如何恢复我的问题。

让我来介绍一下我的问题:

我想获得通用类型的类型。

一些代码:

public class AbstractDao<T, PK extends Serializable> {
    public T getByPrimaryKey(PK primariKey) {
    return null;
    }
}

public class AbstractEntity<PK extends Serializable> {
    PK id;
    //Getter Setter
}

public class Entity extends AbstractEntity<Long> {
}

我想改变的代码:

 public class AbstractService<T, PK extends Serializable> {
    AbstractDao<T, PK> dao;

    public T getByPrimaryKey(final PK primaryKey) {
        return dao.getByPrimaryKey(primaryKey);
    }
 }

 public class EntityService extends AbstractService<Entity, Long> {}

我们的想法是从AbstractService中删除“PK extends Serializable” 并动态地得到它。

知道怎么做吗? - &GT; PK应该保留...我不想在方法中使用“对象”而不是“PK”:

public T getByPrimaryKey(final PK primaryKey) 

感谢您的帮助。

亲切的问候

2 个答案:

答案 0 :(得分:0)

如果您不想要通用PK类型,那么您可以创建一个PrimaryKey接口作为实际主键的包装器,具有各种实现,例如LongPrimaryKey等。这样你可以避免泛型类型。

但是,如果你想能够传递实际类型本身(例如Long),那么我看不到泛型类型的方法,在我看来,它在适当的位置。

答案 1 :(得分:0)

如果您创建AbstractDao的具体实例,java可以确定其泛型类型。

(Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

将为您提供第一个Generic Paramter的运行时类型。这并不总是可用,因此请查看文档和。