В моем классе есть следующий участник:
List<? extends SomeObject> list;
Когда я пытаюсь сделать:
list.add(list.get(0));
Я получаю:
Test.java:7: error: no suitable method found for add(CAP#1)
list.add(list.get(0));
^
method Collection.add(CAP#2) is not applicable
(argument mismatch; Object cannot be converted to CAP#2)
method List.add(CAP#2) is not applicable
(argument mismatch; Object cannot be converted to CAP#2)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ? extends Object
CAP#2 extends Object from capture of ? extends Object
У меня двоякий вопрос:
Почему он не компилируется? Почему я не могу передать результат get()
в add()
?
И как я могу достичь этого по-другому, не прибегая к кастингу?
Я понимаю, что в методе с <T extends SomeObject>
я не могу просто сказать:
T someObject = list.get(0);
list.add(someObject);
, поскольку мой T может быть другим расширением, чем расширение ?
.
Я также понимаю, что не могу сказать:
List<? extends SomeObject> list1;
List<? extends SomeObject> list2;
list1.add(list2.get(0));
Но так как add и get должны работать с одним и тем же универсальным типом в list.add(list.get(0))
, я не понимаю, почему компилятор не принимает его.
Что мне действительно нужно, это
[something of type T where T is whatever was used to instantiate list] someObject = list.get(0);
list.add(someObject);
чтобы я смог позже
list.add(someObject);
Не думаю, что мне нужно шаблонировать весь класс, чтобы этого добиться, не так ли?
class MyClass<T extends SomeObject> {
List<T> list;
, а затем метод с
T someObject = list.get(0);
конечно работает, но привинчивает другие части моего кода.
Итак, первый вопрос: почему это не работает, второй вопрос: какой лучший обходной путь?