<의 차이점은 무엇입니까? Foo> 및 <Foo> 확장


20

나는 사이의 차이에 대한 오해 것 같다 <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목록에 추가 할 수 없는지 궁금 합니다.

내 이해의 구멍은 어디에 있습니까?



1
<? extends Foo>확장 되는 구체적 이고 알려지지 않은 클래스입니다 Foo. 이 클래스를 가진 작업은 법적 될 경우에만 법적으로 어떤 의 서브 클래스 Foo.
Ordous

3
와우. Java의 제네릭에 대해 더 많이 배울수록 더 많은 문제가 발생합니다.
메이슨 휠러

답변:


15

당신이 스스로 발견 한 것처럼 ArrayList선언은 ArrayList<? extends Foo> subFoos = new ArrayList<>();별로 유용하지 않습니다.

유용성을 확인하려면 다음을 <? extends T>고려하십시오.

List<Foo> collect( List<? extends Foo> a1, List<? extends Foo> a2 )
{
    List<Foo> collected = new ArrayList<>();
    collected.addAll( a1 );
    collected.addAll( a2 );
    return collected;
}

나중에 다음과 같이 사용할 수 있습니다.

List<Foo> foos = collect( new ArrayList<Foo>(), new ArrayList<Bar>() );

또는 다음과 같이 :

List<Foo> foos = collect( new ArrayList<Bar>(), new ArrayList<Foo>() );

collect메소드가 다음과 같이 선언 된 경우 위의 어느 것도 작동하지 않습니다 .

List<Foo> collect( List<Foo> a1, List<Foo> a2 )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.