我具有以下类结构:

public class BasePage {
    ...
}

public class PageA extends BasePage {
    ...
    public void doStuffA() {}
}

public class PageB extends BasePage {
    ...
    public void doStuffB() {}
}


然后,我还有另一个包含一些getter / setter的类:

public class TestBase {

private static BasePage currentPage;

public static <T extends BasePage> T getCurrentPage() {
    return (T) currentPage;
}

public static void <T extends BasePage> setBasePage(T page) {
    currentPage = page
}


在测试中,我想使用如下方法:

TestBase.getCurrentPage<PageA>().doStuffA()


但是IntelliJ似乎不喜欢最后一种语法。我究竟做错了什么?


  它说:无法解析符号“ getCurrentPage”


它似乎确实能够解析TestBase.getCurrentPage(),但是我无法访问任何doStuff方法。

最佳答案

快速解决

正如@Andrew所指出的,这是为静态方法指定通用类型的方法:

TestBase.<PageA>getCurrentPage().doStuffA();


这是我们在Collections.emptyList()处使用的语法:

Collections.<String>emptyList();


重新设计

我有点担心这并不是您真正需要的。即您可以为getCurrentPage()指定一种类型,为setCurrentPage()指定另一种类型。在这两种情况下,您都是<T extends BasePage>。但是,这是方法级别的类型,因此您可以在每次调用时更改它们。例如,这将通过编译器。另一方面,它会给您一个ClassCastException

TestBase.<PageB>setBasePage(new PageB());
TestBase.<PageA>getCurrentPage().doStuffA(); // Fine for the compiler. Throws an Exception though


我会将currentPage重写为非静态字段,在这种情况下,我将使用类级别的类型:

public class TestBase <T extends BasePage> {

    private T currentPage;

    public T getCurrentPage() {
        return currentPage;
    }

    public void setBasePage(T page) {
        currentPage = page;
    }

}


它使语法变得简单:

TestBase<PageA> testBase = new TestBase<>(); // specify the page type
testBase.setBasePage(new PageA());
testBase.getCurrentPage().doStuffA(); // easy-peasy


此外,编译器还会为您发现类型错误:

TestBase<PageA> testBase = new TestBase<>(); // specify the page type
testBase.setBasePage(new PageB()); // compiler error

09-20 17:48