我正在尝试创建一个通用 JavaFX Service
,该 JavaFX 将使用DbUtils' BeanListHandler
将ObservableList
返回给应用程序 GUI 线程。目的是重用它以将许多表加载到不同 bean 类的许多不同列表中。
我遇到的问题是call()
处理Task
.
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
我很确定我只是在搞乱仿制药的处理,但我不确定如何。我已经按照DbUtils 示例页面上列出的示例来使用 BeanListHandler,将我认为适合使用泛型类型的地方替换为它,但我对错误一无所知。
非常感谢任何帮助,谢谢!
解决了!
在下面 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);
//...
}
}
感谢大家的帮助,我希望这对其他人有帮助!