source

Java Generics(와일드카드)

gigabyte 2022. 12. 28. 21:36
반응형

Java Generics(와일드카드)

Java의 범용 와일드카드에 대해 몇 가지 질문이 있습니다.

  1. 와의 차이는 무엇입니까?List<? extends T>그리고.List<? super T>?

  2. 제한 와일드카드란 무엇이며 제한되지 않은 와일드카드란 무엇입니까?

첫 번째 질문에서<? 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>을 사용하다.

  1. 가 에서 List<A>줄 수 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다.List<A-sub>이기 때문에 (A-sub는 A이기 에)
  2. List<A>줄 수 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다, 줄 수 있다.List<A-super>에) (A'A-super로 합니다.

예를 들어 학습:

고려하다sort() in the method in the method in 。Collectionsextends ★★★★★★★★★★★★★★★★★」super:

    public static <T extends Comparable<? super T>> void sort(List<T> list){...}

그렇게

왜 : 리스트 아이템이 필요하기 때문에 (T의 .Comparable인터페이스입니다.

Why: 왜냐하면 우리는 이 시스템을ComparableType은 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

반응형