2012-08-02 151 views
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,从而导致编译器不确定实际上它是否是扩展B的A或可能的X的列表?

其他再压制警告,怎么检查这个? (未选中铸)

回答

3

它不是类型安全的,因为该方法可以返回任何类型的是B的子类型的列表 - 这可能会或可能不会是A.

如何写这个:

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

现在铸造不再需要:

List<A> a = c.doSomethingWithListOfA(listOfA); 
+0

感谢吉姆!清晰明了的解释和例子 – JAM 2012-08-02 02:09:52