java - 返回 List<WebElements> 周围的代理

标签 java generics selenium proxy-classes

我目前正在编写这个函数:

public WebElementList findWebElementList(final By by){
    return new WebElementList((List<WebElement>) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class<?>[] { List.class }, new InvocationHandler() {
        // Lazy initialized instance of WebElement
        private List<WebElement> webElements;

        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            if (webElements == null) {
                webElements = findElements(by);
            }
            return method.invoke(webElements, args);
        }
    }), driver);
}

它正在抛出从对象到列表的未经检查的转换。我在 WebElement 周围使用了代理,但它没有......所以我相信这是由于 List 是泛型类引起的。

有没有办法让我在列表周围拥有代理,并且不会收到未经检查的强制转换警告?

最佳答案

方法Proxy.newProxyInstance返回 Object 。因为您知道这个对象将始终是 List<WebElement> ,你将它转换为这种类型。在这种情况下,Java 无法猜测这会正常,并会向您显示警告。如果不是这种情况,这可能会在运行时引发异常。

但是在这里,由于您知道在运行时不会抛出任何异常,因此您可以通过添加 @SuppressWarnings("unchecked") 来摆脱此警告。注释让 Java 知道您知道这种未经检查/不安全的转换。

你会做这样的事情:

public WebElementList findWebElementList(final By by){
   @SuppressWarnings("unchecked")
   return new WebElementList((List<WebElement>) Proxy.newProxyInstance(...

对此有一个很好的解释 @SuppressWarnings from Jon Skeet .

关于java - 返回 List<WebElements> 周围的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274146/

相关文章:

java - Jackson 将所有属性编码为 base64

java - 如何使用 PowerMockito 模拟 protected 静态内部类

c# - 没有装箱或类型参数转换

C# 转换继承的通用接口(interface)

angularjs - Protractor 找不到 chromedriver : The driver executable does not exist:

java - Selenium - WebElement 对象是存储它们的数据还是检索它 "live"?

java - 通过 GUI 的作业进程在同一个虚拟处理器上执行,而通过命令行利用任何可用的虚拟处理器

java - android 在 eclipse 中构建得很好,但在 jenkins ant 上则不行

java - 在静态方法中获取实际泛型类型的类对象

java - 如何通过 selenium 从多行 <tag> 中检索文本