Java 实例化泛型类T对象并返回它
我正在进行java selenium测试,并尝试设置一个流畅/方法链接设计代码: 我有一个通用的按钮类,它允许从一个页面类导航到另一个页面类。按钮是我的页面类的属性。按钮类中的方法应该能够返回在按钮实例化时定义的通用页面类(您所在的页面、按钮指向的页面等)。 但我不知道如何在不打破主课流畅设计的情况下做到这一点:Java 实例化泛型类T对象并返回它,java,generics,return-value,method-chaining,fluent-interface,Java,Generics,Return Value,Method Chaining,Fluent Interface,我正在进行java selenium测试,并尝试设置一个流畅/方法链接设计代码: 我有一个通用的按钮类,它允许从一个页面类导航到另一个页面类。按钮是我的页面类的属性。按钮类中的方法应该能够返回在按钮实例化时定义的通用页面类(您所在的页面、按钮指向的页面等)。 但我不知道如何在不打破主课流畅设计的情况下做到这一点: Button.java public class Button<T, U> { public T observe() { return new T(
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
}
}
public class FirstPage {
public Button<FirstPage, SecondPage> buttonOnFirstPage = new Button<>();
}
public class SecondPage {
public Button<SecondPage, AnotherPage> buttonOnSecondPage = new Button<>();
}
public class BrowsingTest {
public static void main(String[] args) {
new FirstPage()
.buttonOnFirstPage.observe()
.buttonOnFirstPage.click()
.buttonOnSecondPage.observe()
.buttonOnSecondPage.click(); //etc.
}
}
SecondPage.java
public class Button<T, U> {
public T observe() {
return new T(); // Does not work
}
public U click() {
return new U(); // Does not work
}
}
public class FirstPage {
public Button<FirstPage, SecondPage> buttonOnFirstPage = new Button<>();
}
public class SecondPage {
public Button<SecondPage, AnotherPage> buttonOnSecondPage = new Button<>();
}
public class BrowsingTest {
public static void main(String[] args) {
new FirstPage()
.buttonOnFirstPage.observe()
.buttonOnFirstPage.click()
.buttonOnSecondPage.observe()
.buttonOnSecondPage.click(); //etc.
}
}
你知道我该如何构建button类吗?非常感谢 泛型类型是确保类型安全的编译时表示法。它们在运行时被擦除 这意味着运行时不存在
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();
}
}
公共类按钮{
私有最终供应商不可能创建泛型类型以外的实例
您应该寻找以下解决方法:
恼人的是,关闭此按钮可重定向到十年前的一些难以辨认的答案,这些答案无疑会阻止您尝试。这在您的情况下是完全可行的。提示:为每个按钮创建一个anon子类(new button(){}
)若要锁定泛型,请在构造函数中使用GuavaTypeToken
轻松提取Class
此解决方案没有任何问题,但泛型不会在运行时被具体子类型锁定时被删除。有关如何利用此事实的信息,请参阅TypeToken。@drekbour注意TypeToken子类是非泛型类。同意,但你清楚地表明,如果有一个完美的解决方案(提供子类的设计是可以的),就没有解决T的方法。@drekbour你可能想写自己的答案。像个魔术师一样工作:)