我想为扩展抽象类BusinessObject
的每个BO包含一个create方法。我想出了下面显示的方法,但是在编译时我在createDao(...)
语句中得到以下异常:
'invalid inferred types for D; inferred type does not conform to declared bound(s)'
这就是create方法的样子。
public abstract class BusinessObject {
...
public <T extends BusinessObject> T create(T bo) throws InstantiationException, SQLException,
NamingException {
final Dao<T, Long> dao = DaoManager.createDao(getConnectionSource(), bo.getClass());
bo.setTimestampAdded(System.currentTimeMillis());
bo.setTimestampModified(System.currentTimeMillis());
bo.setDateAdded(new Date(System.currentTimeMillis()));
bo.setDateModified(new Date(System.currentTimeMillis()));
dao.create(bo);
return bo;
}
}
在这个主题上,也许有人也可以将我与一个关于泛型问题的体面,全面的教程联系起来。那里有很多基本的教程,但关于中级的东西并不多。
答案 0 :(得分:2)
好的,我一直在玩一点,发现更改方法签名以包含推断类是关键。
public <T extends BusinessObject> T create(T bo, Class<T> cls) throws InstantiationException,
SQLException, NamingException {
final Dao<T, Long> dao = DaoManager.createDao(getConnectionSource(), cls);
bo.setTimestampAdded(System.currentTimeMillis());
bo.setTimestampModified(System.currentTimeMillis());
bo.setDateAdded(new Date(System.currentTimeMillis()));
bo.setDateModified(new Date(System.currentTimeMillis()));
dao.create(bo);
return bo;
}
原因是getClass()
返回Class<?>
而createDao(...)
期望Class<T>
。我想知道是否可以将Class<?>
投射到Class<T>
。然而,Eclipse会发出警告:
&#39;类型安全:取消选中从类转换为类&#39;