为通用子类强制转换超类并添加到列表中

时间:2018-02-27 20:57:06

标签: java generics

我有一个类,如Button,Pane,Checkbox等。所有这些类都扩展自Element类。 我有一个方法

public synchronized  <T extends Element>  List<T> getAllElements() {
   List<WebElement> elements = getDriver().findElements(by);
   List<T> customElements = new ArrayList<>();

   for(int i=0; i<elements.size();i++){
   customElements.add((T) new Element(By.xpath("("+getXpath(by)+")["+i+1+"]")));
}
return customElements;
}    

但是在尝试执行时我遇到了类转换异常     列表与LT;按钮&gt; btns = anybutton.getAllElements();

如何避免这种情况或解决我的问题。感谢

1 个答案:

答案 0 :(得分:0)

使用通用方法,您需要确保它始终返回调用代码所期望的对象类型。实现此目的的通常模式是以Class<T>的形式传递调用代码所期望的对象类型。

以下是代码的修改版本,可以保证并避免运行时ClassCastException

public static  <T extends Element>  List<T> getAllElements(Class<T> clazz) {
    List<WebElement> elements = getDriver().findElements(by);
    List<T> customElements = new ArrayList<>();

    for(int i=0; i<elements.size();i++){
        T element = null;
        try{
            element = clazz.getConstructor( new Class[]{String.class} ).newInstance( By.xpath("("+getXpath(by)+")["+i+1+"]") );     
        }catch(Exception e){
            //log or handle reflection related exceptions
        }
        customElements.add(element);
    }
    return customElements;
 }   

以上假设您的Button类有一个构造函数,它接受By.xpath("("+getXpath(by)+")["+i+1+"]")次返回。您当然可以修改它以使用您的实际类型。这里最重要的是这里没有演员阵容。