gpt4 book ai didi

java - 使用 DbUtils BeanListHandler 在可重用 JavaFX 数据检索服务上摸索通用类型

转载 作者:行者123 更新时间:2023-11-30 11:34:12 26 4
gpt4 key购买 nike

我正在尝试创建一个将使用 DbUtils' 的通用 JavaFX 服务 BeanListHandlerObservableList 返回给应用程序 GUI 线程。目的是重用它以将许多表加载到不同 bean 类的许多不同列表中。

我遇到的问题是处理 Taskcall() 方法中的泛型。

ICINGBean 是一个抽象类,我处理的所有 bean 都继承自 extend。

public class StaticDataFetcher extends Service<ObservableList<? extends ICINGBean>> {
private Class<? extends ICINGBean> beanClass;

@Override
protected Task createTask() {
DataGetter dget = new DataGetter();
dget.setBeanClass(beanClass);
return dget;
}

public Class<? extends ICINGBean> getBeanClass() { return beanClass; }

public void setBeanClass(Class<? extends ICINGBean> beanClass) { this.beanClass = beanClass; }
}


class DataGetter extends Task<ObservableList<? extends ICINGBean>> {
private Class<? extends ICINGBean> beanClass;

@Override
protected ObservableList<? extends ICINGBean> call() {
ObservableList<? extends ICINGBean> staticList;
staticList = FXCollections.observableArrayList();
ResultSetHandler<List<? extends ICINGBean>> handler;
handler = new BeanListHandler<? extends ICINGBean>(beanClass);
try {
List<? extends ICINGBean> resultList;
resultList = EntryPoint.getQRunner().query("SELECT * FROM ?", handler, beanClass.getSimpleName());
staticList = FXCollections.observableList(resultList);
} catch (SQLException ex) {
Logger.getLogger(DataGetter.class.getName()).log(Level.SEVERE, null, ex);
}
return staticList;
}

public Class<? extends ICINGBean> getBeanClass() { return beanClass; }

public void setBeanClass(Class<? extends ICINGBean> beanClass) { this.beanClass = beanClass; }
}

我得到的编译时错误是:

.../ICING/src/com/cccg/icing/StaticDataFetcher.java:55: error: unexpected type
handler = new BeanListHandler<? extends ICINGBean>(beanClass);
^
required: class or interface without bounds
found: ? extends ICINGBean

我很确定我只是把泛型处理搞砸了,但我不确定怎么做。我关注了 listed example在使用 BeanListHandler 的 DbUtils 示例页面上,用它替换了我认为适合使用泛型类型的地方,但我在错误上一无所获。

非常感谢任何帮助,谢谢!

已解决!

根据下面 Paul Bellora 的有用建议,我能够解决这个问题。我为该类声明了一个类型参数,并将其与菱形运算符一起使用。

public class StaticDataFetcher<T extends ICINGBean> extends Task<ObservableList<? extends ICINGBean>> {
private Class<T> beanClass;
//...

public StaticDataFetcher(Class<T> beanClass) {
super();
this.beanClass = beanClass;
}

protected ObservableList<? extends ICINGBean> call() {
//...
ResultSetHandler<List<T>> handler;
handler = new BeanListHandler<>(beanClass);
//...
}
}

感谢大家的帮助,希望对大家有帮助!

最佳答案

不允许使用通配符类型参数实例化泛型类型。在 this answer 中查看我对原因的解释.

一个简单的解决方案是使用 diamond operator (Java 7 及更高版本):

handler = new BeanListHandler<>(beanClass);

如果那不可用,您需要使用通用辅助方法:

<T extends ICINGBean> BeanListHandler<T> makeContainer(Class<T> beanClass) {
return new BeanListHandler<T>(beanClass);
}

...

handler = makeContainer(beanClass);

关于java - 使用 DbUtils BeanListHandler 在可重用 JavaFX 数据检索服务上摸索通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15777282/

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