我具有以下类结构:
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