OracleDocGenericMethod의 일반 메서드에 대해 읽고 있습니다. 와일드 카드를 사용할 때와 제네릭 메서드를 사용할 때를 말할 때 비교에 대해 꽤 혼란 스럽습니다. 문서에서 인용.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
대신 여기에서 일반 메서드를 사용할 수 있습니다.
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] 이것은 타입 인자가 다형성에 사용되고 있음을 알려줍니다. 유일한 효과는 다른 호출 사이트에서 다양한 실제 인수 유형을 사용할 수 있도록하는 것입니다. 이 경우 와일드 카드를 사용해야합니다. 와일드 카드는 여기에서 표현하려는 유연한 하위 유형 지정을 지원하도록 설계되었습니다.
와 같은 와일드 카드 (Collection<? extends E> c);
가 일종의 다형성을 지원 한다고 생각하지 않습니까? 그렇다면 왜 일반적인 방법 사용이 좋지 않은 것으로 간주됩니까?
계속해서 다음과 같이 말합니다.
일반 메서드를 사용하면 형식 매개 변수를 사용하여 메서드 및 / 또는 반환 형식에 대한 하나 이상의 인수 형식 간의 종속성을 표현할 수 있습니다. 이러한 종속성이 없으면 제네릭 메서드를 사용하면 안됩니다.
이것은 무엇을 의미 하는가?
그들은 예를 제시했습니다
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[…]
와일드 카드를 전혀 사용하지 않고 다른 방법으로이 메서드에 대한 서명을 작성할 수 있습니다.
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
이 문서는 두 번째 선언을 권장하지 않고 첫 번째 구문의 사용을 장려합니까? 첫 번째 선언과 두 번째 선언의 차이점은 무엇입니까? 둘 다 같은 일을하는 것 같나요?
누군가이 영역에 빛을 비출 수 있습니까?
?
. `public static <T1 extends Number, T2 extends Number> void copy (List <T1> dest, List <T2> src)로 다시 작성할 수 있으며이 경우 무슨 일이 일어나고 있는지 분명해집니다.