【发布时间】:2010-06-25 18:23:13
【问题描述】:
假设我有几个 POJO,它们都扩展了一个公共超类型 BaseObject。
我有一个GenericDao,它被声明为public interface GenericDao<T>。
对于每个特定类型的 DAO,我都有一个接口,它扩展了泛型类型并将其限制为具体类型 (public interface UserDao extends GenericDao<User>),然后是特定类型 DAO 的实现。
在一个尝试使用多个 GenericDao 实现的类中,我有一个看起来像这样的方法
public <T extends BaseObject> long create(T object) {
return getDao(object.getClass()).save(object);
}
如果我实现getDao() 使其参数是Class 对象,例如
private <T extends BaseObject> GenericDao<T> getDao(Class<T> clazz) { ... }
然后在create() 方法中对getDao(object.getClass() 的调用无法编译 - 编译器似乎将getDao() 的返回类型解释为
GenericDao<? extends BaseContractObject>
而不是认识到getDao(Class<T>) 将返回给我一个相同类型的GenericDao T。
有人可以解释这是为什么吗?我了解重复出现的相同类型绑定或通配符不一定指相同类型;但是似乎编译器应该从getDao(Class<T>) 的签名中识别出传入的 T 应该与返回的 T 相同(但显然它无法识别这一点,why 是部分我没掌握)。
如果我改为将getDao 的签名定义为
private <T extends BaseContractObject> GenericDao<T> getDao(T obj) { ... }
那么编译create() 实现就没有问题了
public <T extends BaseContractObject> long create(T object) {
return getDao(object).save(object);
}
那么为什么编译器在这种情况下能够识别传递给getDao(T) 的T 参数在返回类型中与T 相同,而当参数为Class<T> 时它无法识别这一点?
【问题讨论】:
标签: java generics type-bounds