itsource

클래스와 인터페이스를 갖춘 Java Generics - 함께

mycopycode 2022. 8. 17. 23:56
반응형

클래스와 인터페이스를 갖춘 Java Generics - 함께

Class 객체를 가지고 싶은데 클래스 A를 확장하여 인터페이스B를 구현하도록 강제하고 싶습니다.

할 수 있는 일:

Class<? extends ClassA>

또는 다음 중 하나를 선택합니다.

Class<? extends InterfaceB>

둘 다 할 수 없어요.방법이 있을까요?

사실, 당신은 당신이 원하는 것을 할 수 있습니다.복수의 인터페이스 또는 클래스+인터페이스를 제공하는 경우는, 와일드 카드를 다음과 같이 할 필요가 있습니다.

<T extends ClassA & InterfaceB>

페이지 하단에 있는 sun.com의 Generics Tutorial, 특히 Bounded Type Parameters 섹션을 참조하십시오.필요에 따라서, 복수의 인터페이스를 일람표시할 수 있습니다.& InterfaceName필요한 만큼만 사용할 수 있습니다.

이것은 임의로 복잡해질 수 있습니다.의 JavaDoc 선언을 참조해 주세요.이 선언은 (2행으로 바꿉니다).

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>, 클래스명이 선두에 있고, 인터페이스가 그 뒤에 와야 합니다.물론 하나의 클래스만 나열할 수 있습니다.

"익명" 유형 파라미터(즉, 를 사용하는 와일드카드)에는 사용할 수 없습니다.?). 단, "named" 타입의 파라미터로 실행할 수 있습니다.메서드 또는 클래스 수준에서 type 파라미터를 선언하기만 하면 됩니다.

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

코틀린에서 하는 방법은 다음과 같습니다.

fun <T> myMethod(item: T) where T : ClassA, T : InterfaceB {
    //your code here
}

언급URL : https://stackoverflow.com/questions/745756/java-generics-with-a-class-an-interface-together

반응형