2

假设我们正在处理以下设置:

A extends B

主要做:

public void doIt() {
    List<A> listOfA = new ArrayList<A>();
    listOfA.add(new A());
    listOfA.add(new A());

    C c = new C();
    // We know that really, listOfA is going to be modified
    //  in some way and will be returned to us, thus, it is 
    //  ok to cast result back to what we know it to be
    List<A> a = (List<A>) c.doSomethingWithListOfA(listOfA);
}

什么时候C有方法

public List<? extends B> doSomethingWithListOfA(List<? extends B> 
                                     listOfObjectsThatExtendB) {
    return someFormofListA;
}

(List) c.doSomethingWithListOfA(listOfA); 的演员表 - Type safety: Unchecked cast from List<capture#1-of ? extends B> to List<A>带着警告回来。

我想知道这是否可能是因为其他一些类也可能扩展 B,从而使编译器不确定它实际上是 A 的列表还是扩展 B 的 X?

除了抑制警告之外,如何检查这一点?(未经检查的演员)

4

1 回答 1

3

它不是类型安全的,因为该方法可以返回任何类型的列表,它是 B 的子类型——可能是也可能不是 A。

怎么写这个:

public <T extends B> List<T> doSomethingWithListOfA(List<T> listOfObjectsThatExtendB) {
  return listOfObjectsThatExtendB;
}

现在不再需要铸造:

List<A> a = c.doSomethingWithListOfA(listOfA);
于 2012-08-02T02:02:53.083 回答