1

I have this pseudo code :

Example A
Interface Option
Class OptionImplementer implements Option
ArrayList<ArrayList<? extends Option>> test = new ArrayList<ArrayList<OptionImplementer>>(); <-- Fails?

Why does it fail? Child does implement Option, and I've also tried Super keyword instead of extends.

As "bonus" question, these constructor signatures are postulated to have same erasure:

 Example B
    public void test(ArrayList<ArrayList<? extends Option>> test) {

}
public void test(ArrayList<ArrayList<OptionImplementer>> test) {

}

Example A or B should work. A fails so be B should work...

4

2 回答 2

2

你确定它失败了吗?它不应该,当我尝试这个时它不会:

interface Option {}
class Child implements Option {}

public class Example {
    public static void main(String[] args) {
        ArrayList<? extends Option> list = new ArrayList<Child>();
    }
}

list但是请注意,如果您这样编写,则无法添加任何内容。为什么你不能添加到这样的列表之前已经被问过很多次了,例如:

于 2012-10-22T11:42:47.860 回答
1

这是因为一个

ArrayList<ArrayList<? extends Option>>

可以包含两个类型的条目ArrayList<Option>ArrayList<OptionImplementer>虽然

ArrayList<ArrayList<OptionImplementer>>()

只能包含第二种类型的条目。在第一种情况下,允许以下情况:

test.add(new ArrayList<Option>());
test.add(new ArrayList<OptionImplementer>());

关于你的第二个问题,它是不相关的,但这只是意味着如果你删除所有通用信息,这些方法将具有相同的签名,这是不允许的。

于 2012-10-22T13:23:49.940 回答