我嘗試將類型爲SubTest
的對象添加到具有通用類型T
的列表中,該列表被定義爲<T extends SubTest>
。我期望這個工作,但編譯器告訴我,它不能將SubTest
轉換爲T
。我只是在這裏看不到問題。Java泛型:編譯器將不會推斷類型,儘管它們兼容
下面是完整的代碼:
public class Test<T extends Test.SubTest> {
private List<T> list = new ArrayList<T>();
public void add() {
list.add(new SubTest()); //<- compile error here
}
protected static class SubTest {
}
}
是的,我知道我可以簡單的寫
list.add((T) new SubTest());
,它會工作。但問題是:爲什麼不工作 沒有不必要的轉換?
這裏的根本問題是'T'可能是'SubTest'的_subtype_,在這種情況下,將'SubTest'添加到'list'會主動地破壞類型安全。演員陣容不僅僅是必要的,在合理的情況下很可能會失敗。 –