development

여러 클래스를 가진 Java Generics 와일드 카드

big-blog 2020. 2. 28. 19:20
반응형

여러 클래스를 가진 Java Generics 와일드 카드


Class 객체를 갖고 싶지만 클래스 A를 확장하고 인터페이스 B를 구현하도록 클래스를 강제로 설정하고 싶습니다.

내가 할 수있는:

Class<? extends ClassA>

또는:

Class<? extends InterfaceB>

하지만 둘 다 할 수는 없습니다. 이것을 할 수있는 방법이 있습니까?


실제로 원하는 것을 수 있습니다 . 여러 인터페이스 또는 클래스와 인터페이스를 제공하려면 와일드 카드를 다음과 같이 보여야합니다.

<T extends ClassA & InterfaceB>

페이지 하단의 sun.com Generics Tutorial , 특히 Bounded Type Parameters 섹션을 참조하십시오. 원하는 & InterfaceName인터페이스를 사용하여 원하는 경우 실제로 둘 이상의 인터페이스를 나열 할 수 있습니다 .

이것은 임의로 복잡해질 수 있습니다. 시연하려면 다음의 JavaDoc 선언을 참조하십시오 Collections#max.

public static <T extends Object & Comparable<? super T>> T
                                           max(Collection<? extends T> coll)

왜 그렇게 복잡한가? Java Generics FAQ : 바이너리 호환성 유지 .

변수 선언에서는 작동하지 않는 것처럼 보이지만 클래스에 일반적인 경계를 설정하면 작동합니다. 따라서 원하는 작업을 수행하려면 몇 개의 농구대를 뛰어 넘어야 할 수도 있습니다. 그러나 당신은 할 수 있습니다. 클래스에 일반적인 경계를두고 다음과 같이 할 수 있습니다.

class classB { }
interface interfaceC { }

public class MyClass<T extends classB & interfaceC> {
    Class<T> variable;
}

얻을 variable것을 당신이 원하는 것을 제한이있다. 자세한 정보 및 예 는 Java 5.0Generics 3 페이지를 참조하십시오 . 참고에 <T extends B & C>, 클래스 이름이 먼저 와야하고, 인터페이스은 다음과 같습니다. 물론 단일 클래스 만 나열 할 수 있습니다.


"익명"유형 매개 변수 (예 :)를 사용하는 와일드 카드로 ?수행 할 수 없지만 "명명 된"유형 매개 변수로 수행 할 수 있습니다. 메소드 또는 클래스 레벨에서 유형 매개 변수를 선언하십시오.

import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
    T t;
}

유형 매개 변수는 여러 범위를 가질 수 있습니다. 예를 들어

public static <T extends Number & Comparable<T>> T maximum(T x, T y, T z)

T일반 클래스 상자에 전달되는 형식 매개 변수이며, Number 클래스와 필수의 implments Comparable 인터페이스의 하위 유형이어야합니다. 클래스가 바운드로 전달 된 경우 인터페이스보다 먼저 전달되어야합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.

public static <T extends Number & Comparable<T>> T maximum(T x, T y, T z) {
    T max = x;      
    if(y.compareTo(max) > 0) {
        max = y;   
    }

    if(z.compareTo(max) > 0) {
        max = z;                    
    }
    return max;      
}

자세한 내용은 여기를 참조 하십시오

참고 : https://stackoverflow.com/questions/745756/java-generics-wildcarding-with-multiple-classes



반응형