Java Generics(와일드카드)
Java의 범용 와일드카드에 대해 몇 가지 질문이 있습니다.
와의 차이는 무엇입니까?
List<? extends T>
그리고.List<? super T>
?제한 와일드카드란 무엇이며 제한되지 않은 와일드카드란 무엇입니까?
첫 번째 질문에서<? extends T>
그리고.<? super T>
에 경계 와일드카드의 예를 나타냅니다.무제한 와일드카드는 다음과 같습니다.<?>
, 그리고 기본적으로는<? extends Object>
대략적으로 범용은 어떤 타입이든 사용할 수식어느 타입이든 상관없습니다.경계 와일드카드(<? extends T>
또는<? super T>
)는 특정 유형을 확장해야 한다고 하여 유형에 제한을 가합니다( ).<? extends T>
는 상한으로 알려져 있습니다.또는 특정 유형의 상위여야 합니다(<? super T>
하한으로 알려져 있습니다).
Java Tutorials는 Wildcards 및 More Fun with Wildcards 기사에 제네릭스에 대한 좋은 설명이 있습니다.
클래스 계층이 있는 경우A
,B
의 하위 클래스입니다.A
,그리고.C
그리고.D
둘 다 의 아류이다.B
아래와 같이
class A {}
class B extends A {}
class C extends B {}
class D extends B {}
그리고나서
List<? extends A> la;
la = new ArrayList<B>();
la = new ArrayList<C>();
la = new ArrayList<D>();
List<? super B> lb;
lb = new ArrayList<A>(); //fine
lb = new ArrayList<C>(); //will not compile
public void someMethod(List<? extends B> lb) {
B b = lb.get(0); // is fine
lb.add(new C()); //will not compile as we do not know the type of the list, only that it is bounded above by B
}
public void otherMethod(List<? super B> lb) {
B b = lb.get(0); // will not compile as we do not know whether the list is of type B, it may be a List<A> and only contain instances of A
lb.add(new B()); // is fine, as we know that it will be a super type of A
}
경계 와일드카드는 다음과 같습니다.? extends B
어디에B
어떤 유형입니다.즉, 유형을 알 수 없지만 "바인드"를 지정할 수 있습니다.이 경우 B의 하위 클래스인 일부 클래스에 의해 경계됩니다.
Josh Bloch는 또한 언제 사용해야 하는지에 대한 좋은 설명을 가지고 있다.super
그리고.extends
구글 io 비디오 토크에서 그는 생산자 컨슈머 니모닉을 언급했습니다.
프레젠테이션 슬라이드:
벌크 메서드를 다음에 추가한다고 가정합니다.
Stack<E>
void pushAll(Collection<? extends E> src);
– src는 E프로듀서
void popAll(Collection<? super E> dst);
– dst는 E컨슈머
타입 파라미터로 전달할 수 있는 타입의 종류를 제한하는 경우가 있습니다.예를 들어 번호로 동작하는 메서드는 Number 또는 해당 서브클래스의 인스턴스만 받아들이려고 할 수 있습니다.이것이 경계형 파라미터의 목적입니다.
Collection<? extends MyObject>
즉, MyObject와 IS-A 관계가 있는 모든 오브젝트(즉, MyObject의 일종 또는 MyObject의 서브클래스의 임의의 오브젝트라고 말할 수 있는 모든 오브젝트) 또는 MyObject 클래스의 오브젝트를 받아들일 수 있습니다.
예를 들어 다음과 같습니다.
class MyObject {}
class YourObject extends MyObject{}
class OurObject extends MyObject{}
그리고나서,
Collection<? extends MyObject> myObject;
는 MyObject 또는 MyObject의 자녀(OurObject, YourObject 또는 MyObject 유형의 개체만 허용하지만 MyObject의 슈퍼클래스의 개체는 허용하지 않습니다).
일반적으로는
구조물에 양식 유형을 가진 요소가 포함된 경우
? extends E
, 우리는 구조에서 요소들을 얻을 수 있지만, 우리는 구조 안에 요소들을 넣을 수 없다.
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(3.14); // compile-time error
assert ints.toString().equals("[1, 2, 3.14]");
는 또 다른 , 즉 와일드카드가 합니다.Wildcards with super
,
List<Object> objs = Arrays.<Object>asList(2, 3.14, "four");
List<Integer> ints = Arrays.asList(5, 6);
Collections.copy(objs, ints);
assert objs.toString().equals("[5, 6, four]");
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
}
일반 와일드카드는 Collection에서 동작하는 메서드를 보다 재사용하기 쉽게 하기 위해 생성됩니다.
메서드에 List<A>
줄 수 은 , 줄 수 밖에 없습니다.List<A>
을 사용하다.
- 가 에서
List<A>
줄 수 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다.List<A-sub>
이기 때문에 (A-sub는 A이기 에) -
List<A>
줄 수 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다.List<A-super>
에) (A'A-super로 합니다.
예를 들어 학습:
고려하다sort()
in the method in the method in 。Collections
다 extends
★★★★★★★★★★★★★★★★★」super
:
public static <T extends Comparable<? super T>> void sort(List<T> list){...}
그렇게
왜 : 리스트 아이템이 필요하기 때문에 (T
의 .Comparable
인터페이스입니다.
Why: 왜냐하면 우리는 이 시스템을Comparable
Type은 T의 모든 슈퍼 타입의 Comparible이 됩니다.
고려하다
interface Comparable<T>{
public int compareTo(T o);
}
public static <T extends Comparable<? super T>> void sort(List<T> list){...}
public static <T extends Comparable<T>> void sort2(List<T> list){...}
class A implements Comparable<A>{
@Override
public int compareTo(A o) {
...
}
}
class B extends A {
}
List<A> listA = new ArrayList<>();
List<B> listB = new ArrayList<>();
sort(listA); //ok
sort(listB); //ok
sort2(listA); //ok
sort2(listB); //Error
언급URL : https://stackoverflow.com/questions/252055/java-generics-wildcards
'source' 카테고리의 다른 글
Panda dataframe fillna() 일부 열만 지정 (0) | 2022.12.28 |
---|---|
JVM 인수가 "-D"로 시작하는 이유는 무엇입니까? (0) | 2022.12.28 |
변수를 사용하여 객체 속성에 동적으로 액세스 (0) | 2022.12.28 |
MySQL - 테이블 복제 (0) | 2022.12.18 |
비동기/대기 클래스 컨스트럭터 (0) | 2022.12.18 |