如何创建返回扩展同一父级的不同类型的泛型方法



我创建了这样的方法:

public BaseMenu openMenu(MenuItem menuItem) {
utils.clickOnElement(menuItem);
BaseMenu baseMenu = null;
switch (menuItem) {
case FIRST:
baseMenu = new FirstMenu();
break;
case SECOND:
baseMenu = new SecondMenu();
break;
case THIRD:
baseMenu = new ThirdMenu();
break;
}
return baseMenu;
}

它返回类型BaseMenu。如何转换它,使其返回特定的菜单类型(扩展BaseMenu(,如FirstMenu、SecondMenu等。?

我试过这样的东西:

public <T extends BaseMenu> T openMenu(MenuItem menuItem) {
utils.clickOnElement(menuItem);
T baseMenu = null;
switch (menuItem) {
case FIRST:
baseMenu = (T) new FirstMenu();
break;
case SECOND:
baseMenu = (T) new SecondMenu();
break;
case THIRD:
baseMenu = (T) new ThirdMenu();
break;
}
return baseMenu;
}

但它也返回BaseMenu。

代码应该如何才能像我预期的那样工作?这样做可能吗?还有其他方法可以实现吗?

编辑:

我现在如何使用它:

FirstMenu firstMenu = new MainPage().getSomeElementContainingMenu().openMenu(FIRST);
firstMenu.doSomethingFromFirstMenu();

我想如何使用它:

new MainPage().getSomeElementContainingMenu().openMenu(FIRST).doSomethingFromFirstMenu(); 
//where result of openMenu(specificMenu) will be new SpecificMenu(), not BaseMenu() like now 

它不一定要基于switch,这是我最初的想法,我在这里分享了它,但它并没有像我想象的那样起作用,所以我也很乐意看到其他可能的解决方案。

无法转换此函数。返回BaseMenu是一个有效的解决方案,它描述了您的用例。如果需要,调用者应该负责将其强制转换为所需的类型。

泛型的主要思想是让调用者确定泛型的类型,这样您的函数就可以专注于您真正关心的部分。因此,如果我调用该函数并声明我希望该泛型是我自己实现的类,那么您的函数将需要使用它

例如,此代码示例将是泛型版本的有效用法。

class Foo extends BaseMenu { /* etc. */ }
Foo foo = openMenu(menuItem);

或者,如果您还为firstMenusecondMenu等添加方法,可能会更有意义。如果您只需要使用所有BaseMenu实现的功能,那么您实际上只应该以这种方式选择菜单。

public <T extends BaseMenu> T openMenu(MenuItem menuItem) {
utils.clickOnElement(menuItem);
T baseMenu = null;

switch (menuItem) {
case FIRST:
baseMenu = new FirstMenu();
break;
case SECOND:
baseMenu = new SecondMenu();
break;
case THIRD:
baseMenu = new ThirdMenu();
break;
}
return (T) baseMenu;
}

当您调用此方法时!你必须这样使用:

FirstMenu fm=openMenu(menuItem(;

你不应该使用:

BaseMenu bm=openMenu(menuItem(;

因为你的方法返回值是T,T类型是你处理该返回值的类型,如果你使用BaseMenu获取该返回值,那么T将是BaseMenu!!

最新更新