列表转换接口在Java中失败

List casting interface is failing in Java

本问题已经有最佳答案,请猛点这里访问。

我有以下接口:

1
2
public interface CustomWebElement extends WebElement
. . . methods

在以下情况下,当我试图将WebElement投射到CustomWebElement时,情况很好:

1
CustomWebElement a = (CustomWebElement) element.findElement(by); //findElement return WebElement

但是对返回List强制转换的findElements方法的调用失败:

1
List<CustomWebElement> a = (List<CustomWebElement>) element.findElements(by);

例外情况:

1
Inconvertable types; Cannot cast List<WebElement> to List<CustomWebElement>

在这种情况下,ListCast为什么会失败?


请查看http://docs.oracle.com/javase/tutorial/java/generics/

CustomWebElement extends WebElement并不意味着List extends List


ListList一样,本身就是一种对象类型,List不扩展List


在使用泛型时使用通配符可能会有所帮助喜欢

List


这是因为List既不是List的亚型也不是超型。有关更多信息,您可以从Joshua Bloch的有效Java读取ITEM25。我正在从他的书上抄袭和粘贴

Arrays differ from generic types in two important ways. First, arrays are covariant.
This scary-sounding word means simply that if Sub is a subtype of Super, then the
array type Sub[] is a subtype of Super[]. Generics, by contrast, are invariant: for
any two distinct types Type1 and Type2, List is neither a subtype nor a
supertype of List