gpt4 book ai didi

Java通配符错误

转载 作者:行者123 更新时间:2023-11-30 06:19:37 25 4
gpt4 key购买 nike

我有一个 BaseDao 接口(interface),可以使用 hibernate 将数据持久化到 mysql

public interface BaseDao<T extends Serializable> {
public void saveAll(Collection<T> objects) throws PersistenceException;
}

我有一个实体类 hirechy,它们的基类是 BaseActivity(所有扩展可序列化)其中之一:

public class Activity1 extends BaseACtivity{...}

在某些类中我声明了 ActivityDao:

 protected abstract ActivityDao<Activity1> createActivityDao1();

和一个方法:

 private void  persistData(ActivityDao<? extends BaseActivity> activityDao, Collection<? extends BaseActivity> data){
EntityTransaction transaction = activityDao.getEntityManager().getTransaction();

try {
transaction.begin();

activityDao.saveAll(data);
transaction.commit();
}
catch (HibernateException ex) {

在 activityDao.saveAll(data) 我得到一个编译时异常:

 Error:(62, 24) java: method saveAll in interface com.matomy.persistence.dao.BaseDao<T>
cannot be applied to given types;
required: java.util.Collection<capture#1 of ? extends
com.matomy.persistence.entity.activities.BaseActivity>
found: java.util.Collection<capture#2 of ? extends com.matomy.persistence.entity.activities.BaseActivity>
reason: actual argument java.util.Collection<capture#2 of ? extends com.matomy.persistence.entity.activities.BaseActivity>
cannot be converted to java.util.Collection<capture#1 of ? extends com.matomy.persistence.entity.activities.BaseActivity>
by method invocation conversion

基础 Activity :

public abstract class BaseActivity implements Serializable, Comparable<BaseActivity> {

请帮忙谢谢!

罗伊

更新:

private <T extends BaseActivity> void  persistData(ActivityDao<T> activityDao, Collection<T> col){
EntityTransaction transaction = activityDao.getEntityManager().getTransaction();

try {
transaction.begin();

activityDao.saveAll(col);
transaction.commit();
}
catch (HibernateException ex) {

最佳答案

使用具有相同边界的两个有界通配符并不意味着它们是同一类型。在这种情况下,ActivityDao<? extends BaseActivity> 的实际类型参数可能与 Collection<? extends BaseActivity> 附带的不一样.所以,saveAll()方法行不通。

为了进一步详细说明,编译器用唯一的占位符替换了每个出现的通配符,这不过是对该通配符的捕获。这意味着,Collection<?>变成 Collection<CAP#1 of ?> , 同样 Collection<? extends T>变成 Collection<CAP#1 of ? extends T> .如果 Collection<?>再次遇到,将替换为Collection<CAP#2 of ?> .

因此,您的方法声明有点类似于:

private void  persistData(ActivityDao<CAP#1-of-? extends BaseActivity> activityDao, Collection<CAP#2-of-? extends BaseActivity> data){
EntityTransaction transaction = activityDao.getEntityManager().getTransaction();

try {
transaction.begin();

activityDao.saveAll(data);
transaction.commit();
}
catch (HibernateException ex) {
}
}

哪里CAP#1CAP#2是编译器的不同类型参数。当然是saveAll的签名对于那个方法变成这样:

public void saveAll(Collection<CAP#1-of-? extends BaseActivity> objects) throws PersistenceException;

自从 Collection<T1>Collection<T2> 不同 用于两个不同类型的参数,因此方法调用失败。

您可以改用通用方法解决此问题:

private <T extends BaseActivity> void persistData(ActivityDao<T> activityDao, Collection<T> data){

关于Java通配符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892647/

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