나는 사이의 차이에 대한 오해 것 같다 <Foo>
와 <? extends Foo>
. 우리가 이해했다면
ArrayList<Foo> foos = new ArrayList<>();
이는 유형의 객체 Foo
가이 배열 목록에 추가 될 수 있음을 나타냅니다 . 의 서브 클래스 Foo
도 유형 Foo
이므로 다음과 같이 오류없이 추가 할 수 있습니다.
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Bar());
어디서 Bar extends Foo
?
이제 다음 foos
과 같이 정의했다고 가정 해보십시오 .
ArrayList<? extends Foo> foos = new ArrayList<>();
나의 현재 이해는 이것이 표현한다는 것입니다 some unknown type that extends Foo
. 서브 클래스 인 객체 Foo
를이 목록에 추가 할 수 있음 을 의미 합니다. ArrayList<Foo>
와 사이에 차이가 없음을 의미합니다 ArrayList<? extends Foo>
.
이것을 테스트하기 위해 다음 코드를 작성하려고했습니다.
ArrayList<? extends Foo> subFoos = new ArrayList<>();
subFoos.add(new Foo());
subFoos.add(new Bar());
그러나 다음 컴파일 오류가 표시되었습니다.
no suitable method found for add(Foo)
method java.util.Collection.add(capture#1 of ? extends Foo) is not applicable
(argument mismatch; Foo cannot be converted to capture#1 of ? extends Foo)
no suitable method found for add(Bar)
method java.util.Collection.add(capture#2 of ? extends Bar) is not applicable
(argument mismatch; Bar cannot be converted to capture#2 of ? extends Bar)
나의 현재 이해에 기초하여, 나는 왜 자신의 서브 클래스가 아니기 때문에 Foo
의 목록에 a 를 추가 할 수 없는지 알 수 <? extends Foo>
있다. 하지만 왜 Bar
목록에 추가 할 수 없는지 궁금 합니다.
내 이해의 구멍은 어디에 있습니까?
<? extends Foo>
확장 되는 구체적 이고 알려지지 않은 클래스입니다 Foo
. 이 클래스를 가진 작업은 법적 될 경우에만 법적으로 어떤 의 서브 클래스 Foo
.