实例化一个通用 class T 对象并 return 它
Instantiate a generic class T object and return it
我正在进行 java selenium 测试,我正在尝试设置 fluent/method-chaining 设计代码:
我有一个通用按钮 class,允许从一个页面 class 导航到另一个页面。按钮是我的页面 classes 的属性。按钮 class 中的方法应该能够 return 在按钮实例化时定义的通用页面 classes(您所在的页面、按钮指向的页面等)。
但我想不出如何在不破坏主要 class:
中的流畅设计的情况下做到这一点
Button.java
public class Button<T, U> {
public T observe() {
return new T(); // Does not work
}
public U click() {
return new U(); // Does not work
}
}
FirstPage.java
public class FirstPage {
public Button<FirstPage, SecondPage> buttonOnFirstPage = new Button<>();
}
SecondPage.java
public class SecondPage {
public Button<SecondPage, AnotherPage> buttonOnSecondPage = new Button<>();
}
最后,我希望能够在不强制转换或提及类型的情况下完成,以便从自动完成和其他奇特的 IDE 东西中受益:
BrowsingTest.java
public class BrowsingTest {
public static void main(String[] args) {
new FirstPage()
.buttonOnFirstPage.observe()
.buttonOnFirstPage.click()
.buttonOnSecondPage.observe()
.buttonOnSecondPage.click(); //etc.
}
}
知道如何构建该按钮 class 吗?非常感谢!
泛型是一种编译时符号,用于确保类型安全。它们在运行时被擦除。
这意味着 T
和 U
在运行时不存在。这就是为什么你不能实例化它们。
但是,您可以自己传入构造函数:
public class Button<T, U> {
private final Supplier<? extends T> tConstructor;
private final Supplier<? extends U> uConstructor;
public Button(Supplier<? extends T> tConstructor,
Supplier<? extends U> uConstructor) {
this.tConstructor = tConstructor;
this.uConstructor = uConstructor;
}
public T observe() {
return tConstructor.get();
}
public U click() {
return uConstructor.get();
}
}
并且您可以将这些构造函数作为方法引用传递:
public class FirstPage {
public Button<FirstPage, SecondPage> buttonOnFirstPage =
new Button<>(FirstPage::new, SecondPage::new);
}
无法从通用类型创建实例
您应该寻找这些解决方法:
Instantiating object of type parameter
我正在进行 java selenium 测试,我正在尝试设置 fluent/method-chaining 设计代码:
我有一个通用按钮 class,允许从一个页面 class 导航到另一个页面。按钮是我的页面 classes 的属性。按钮 class 中的方法应该能够 return 在按钮实例化时定义的通用页面 classes(您所在的页面、按钮指向的页面等)。 但我想不出如何在不破坏主要 class:
中的流畅设计的情况下做到这一点Button.java
public class Button<T, U> {
public T observe() {
return new T(); // Does not work
}
public U click() {
return new U(); // Does not work
}
}
FirstPage.java
public class FirstPage {
public Button<FirstPage, SecondPage> buttonOnFirstPage = new Button<>();
}
SecondPage.java
public class SecondPage {
public Button<SecondPage, AnotherPage> buttonOnSecondPage = new Button<>();
}
最后,我希望能够在不强制转换或提及类型的情况下完成,以便从自动完成和其他奇特的 IDE 东西中受益:
BrowsingTest.java
public class BrowsingTest {
public static void main(String[] args) {
new FirstPage()
.buttonOnFirstPage.observe()
.buttonOnFirstPage.click()
.buttonOnSecondPage.observe()
.buttonOnSecondPage.click(); //etc.
}
}
知道如何构建该按钮 class 吗?非常感谢!
泛型是一种编译时符号,用于确保类型安全。它们在运行时被擦除。
这意味着 T
和 U
在运行时不存在。这就是为什么你不能实例化它们。
但是,您可以自己传入构造函数:
public class Button<T, U> {
private final Supplier<? extends T> tConstructor;
private final Supplier<? extends U> uConstructor;
public Button(Supplier<? extends T> tConstructor,
Supplier<? extends U> uConstructor) {
this.tConstructor = tConstructor;
this.uConstructor = uConstructor;
}
public T observe() {
return tConstructor.get();
}
public U click() {
return uConstructor.get();
}
}
并且您可以将这些构造函数作为方法引用传递:
public class FirstPage {
public Button<FirstPage, SecondPage> buttonOnFirstPage =
new Button<>(FirstPage::new, SecondPage::new);
}
无法从通用类型创建实例 您应该寻找这些解决方法: Instantiating object of type parameter