gpt4 book ai didi

java - GenericDao 类型中的方法 read(capture#2-of ?) 不适用于参数 (Long)

转载 作者:行者123 更新时间:2023-12-02 08:27:41 26 4
gpt4 key购买 nike

第一次做泛型,我有点困惑。

我有以下内容:

public interface GenericDao<T, PK extends java.io.Serializable> {

/**
* Retrieve an object that was previously persisted to the database
* using the reference id as primary key
*
* @param id primary key
* @return
*/
public T read(PK id);
}


public class GenericDaoHibernateImpl<T, PK extends java.io.Serializable> implements GenericDao<T, PK>
{
private Class<T> type;
private SessionFactory sessionFactory;

/**
*
*/
public GenericDaoHibernateImpl(Class<T> type)
{
this.type = type;
}


@SuppressWarnings("unchecked")
public T read(final PK id)
{
return (T) getSession().get(type, id);
}
}

<bean id="orderDao" class="vsg.ecotrak.framework.dao.GenericDaoHibernateImpl">
<constructor-arg>
<value>vsg.ecotrak.common.order.domain.Order</value>
</constructor-arg>
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

然后我的服务类只调用 this.getOrderDao().read(pId),其中 pId 作为 Long 传递给服务类上的 load 方法。

最佳答案

问题出在 orderDao 的 Spring 声明中。按照您编写的方式,Spring 会将其解释为

new GenericDaoHibernateImpl(Order something)

而泛型需要这样的签名(删除不必要的构造函数参数)。

new GenericDaoHibernateImpl<Order,Long>()

由于运行时的类型删除,您无法直接从 Spring 推断泛型,但您可以创建一个新类

public class OrderDao extends GenericDaoHibernateImpl<Order,Long> { }

并将其作为 Spring 中自己的 bean 进行引用

<bean id="orderDao" class="vsg.ecotrak.framework.dao.OrderDao">
<property name="sessionFactory"> <ref bean="sessionFactory"/>
</bean>

泛型包含在 OrderDao 中,它将仅返回基于长 PK 的订单,从而按预期运行。

关于java - GenericDao<Order,capture#2-of ?> 类型中的方法 read(capture#2-of ?) 不适用于参数 (Long),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com