与泛型类
JavaFX的自定义组合框我有两种类型的延伸级X与泛型类
public class A extends X
和
public class B extends X
在我的JavaFX应用程序类,需要有一个组合框。这个comboBox是通过使用类A或B构造的,并使用该类的各自的toString()方法来填充。减少代码重复。
我想修改我当前的方法产生下拉框中,这样,它将使A型的ObservableList或B.
protected ComboBox<? extends X> getComboBox(ObservableList<? extends X> list){
ComboBox<? extends X> comboBox = new ComboBox<>();
comboBox.setItems(list);
comboBox.setCellFactory(new Callback<ListView<? extends X>, ListCell<? extends X>>() {
@Override
public ListCell<Controller> call(ListView<Controller> param) {
return new ListCell<? extends X>(){
@Override
public void updateItem(Class<? extends X> content, boolean empty){
super.updateItem(content, empty);
if(!empty) {
setText(content.toString());
} else {
setText(null);
}
}
};
}
});
return comboBox;
}
由于两个班有一个父类,是有可能实现这样的事情(可能,但不是本质上,返回它的原始类类型)
@SillyFly - 我使用反射依赖关系检索列表。它返回一个特定类型的所有类(即A)
public ObservableList<A> getAList() {
Reflections reflection = new Reflections("com.classes.aClasses");
ObservableList<A> classesList = FXCollections.observableArrayList();
for (Class<? extends A> thisClass : reflection.getSubTypesOf(A.class)) {
try {
classesList.add(thisClass.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
return classesList;
}
我敢肯定,默认ListCell
实现使用toString
渲染项目,所以设置单元格工厂可能是多余的。
至于你的问题 - 问题是ComboBox<T>
需要它的items
财产是ObservableList<T>
。由于您使用generic wildcard作为类型参数,编译器无法知道这是否是相同的类型。
你需要做的就是给方法的generic type parameter:
protected <T extends X> ComboBox<T> getComboBox(ObservableList<T> list){
ComboBox<T> comboBox = new ComboBox<>();
comboBox.setItems(list);
// Setting a cell factory is probably redundant if you're only using toString...
return comboBox;
}
注意,我们定义了一个类型参数T
,并迫使它是扩展X
一个类型。所有通用变量此后都会使用此类型参数,因此编译器可以知道所有匹配项。
了解冗余方面。我认为我出于不同的原因早些时候实现了这一点,但现在没有任何意义。 然而,返回列表(也被插入此法)方法: 公共ObservableList getAList() - 当我把这个后,我得到的错误ObservableList
请添加其他方法以及如何对每个原始问题进行调用 - 很难遵循或知道哪里出了问题,通过一个完整的示例更容易理解。 – Itai
我已将这添加到原始问题中。我使用反射包,因为我需要添加某个包的每个类。例如,在com.animals包中,我会添加dog.class,cat.class,rabbit.class - 这是我的意图,因为我希望在此包中添加每个类作为选项。 – Eunanibus
什么是“输入”?这是基类(你以前称为'X')吗? – Itai
更正了此@sillyfly – Eunanibus