여러 클래스를 가진 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.0 의 Generics 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
'development' 카테고리의 다른 글
Gadaffi를 검색하는 정규식 (0) | 2020.02.28 |
---|---|
Java webapp에서 UTF-8을 작동시키는 방법은 무엇입니까? (0) | 2020.02.28 |
NoClassDefFoundError와 ClassNotFoundException의 차이점은 무엇입니까? (0) | 2020.02.28 |
모든 열을 정렬 (0) | 2020.02.28 |
makefile 기호 $ @와 $ <는 무엇을 의미합니까? (0) | 2020.02.28 |