避免Java中泛型的冗余参数
我正在为我的JavaFX应用程序创建一个助手类,如下所示:避免Java中泛型的冗余参数,java,generics,Java,Generics,我正在为我的JavaFX应用程序创建一个助手类,如下所示: public class ViewHelper<T extends Parent, U extends Controller> { private static final String FXML_EXTENSION = ".fxml"; private final Class<? extends Controller> clazz; private FXMLLoade
public class ViewHelper<T extends Parent, U extends Controller> {
private static final String FXML_EXTENSION = ".fxml";
private final Class<? extends Controller> clazz;
private FXMLLoader loader;
private T t;
public ViewHelper(Class<? extends Controller> clazz) throws IOException {
this.clazz = clazz;
this.load();
}
private void load() throws IOException {
this.loader = new FXMLLoader(fxmlUrl());
this.t = this.loader.load();
}
private URL fxmlUrl() {
return clazz.getResource(clazz.getSimpleName() + FXML_EXTENSION);
}
public T component() {
return t;
}
public U controller() {
return loader.getController();
}
}
我更喜欢这样的:
var viewHelper = new ViewHelper<BorderPane>(MainController.class);
var viewHelper=新的viewHelper(MainController.class);
或:
var viewHelper=new viewHelper();
谢谢您的帮助。您可以添加一个要调用的静态方法,而不是构造函数 (类componentType,类controllerType)的公共静态ViewHelper引发IOException{ 返回新的ViewHelper(controllerType); } 你可以这样称呼它:
var viewHelper=viewHelper.of(BorderPane.class,MainController.class);
“当它们始终相同时”它们不必相同,例如新的ViewHelper(Controller2.class)
也有效。如果参数必须与泛型类型相同,那么参数类型将是Class
,而不是Class@Andreas很抱歉给你带来了困惑当它们始终相同时
意味着每当我实例化ViewHelper
时,我总是传递相同的类型。在某种程度上,通过不传递两次类型,它还可以避免我传递两种不同类型的可能性,就像您的示例一样。所以,这就是我现在的问题。如何实现它?您不需要,因为ViewHelper
类被显式声明为支持它们的不同,所以它要求两者都被指定。@Andreas我是编写ViewHelper的人。如何修改ViewHelper
,使我只能通过菱形操作符(
)或构造函数传入MainController
?这就像一个符咒。为了仅使用()的of
方法强制创建ViewHelper
的实例,我将构造函数设为private
。多谢各位。
var viewHelper = new ViewHelper<BorderPane, MainController>(MainController.class);
var viewHelper = new ViewHelper<BorderPane>(MainController.class);
var viewHelper = new ViewHelper<BorderPane, MainController>();