Java 实例化泛型类T对象并返回它

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(

我正在进行java selenium测试,并尝试设置一个流畅/方法链接设计代码:

我有一个通用的按钮类,它允许从一个页面类导航到另一个页面类。按钮是我的页面类的属性。按钮类中的方法应该能够返回在按钮实例化时定义的通用页面类(您所在的页面、按钮指向的页面等)。 但我不知道如何在不打破主课流畅设计的情况下做到这一点:

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(){}
)若要锁定泛型,请在构造函数中使用Guava
TypeToken
轻松提取
Class
此解决方案没有任何问题,但泛型不会在运行时被具体子类型锁定时被删除。有关如何利用此事实的信息,请参阅TypeToken。@drekbour注意TypeToken子类是非泛型类。同意,但你清楚地表明,如果有一个完美的解决方案(提供子类的设计是可以的),就没有解决T的方法。@drekbour你可能想写自己的答案。像个魔术师一样工作:)