实例化一个通用 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 吗?非常感谢!

泛型是一种编译时符号,用于确保类型安全。它们在运行时被擦除。

这意味着 TU 在运行时不存在。这就是为什么你不能实例化它们。

但是,您可以自己传入构造函数:

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