IT Share you

메서드 인수는 클래스를 확장하여 인터페이스를 구현합니다.

shareyou 2020. 11. 27. 21:46
반응형

메서드 인수는 클래스를 확장하여 인터페이스를 구현합니다.


다음과 같은 클래스와 인터페이스가 있습니다.

public class BasicObject{...}
public interface CodeObject{...}

인수가 BasicObject 유형이어야하고 CodeObject를 구현하는 메서드를 만들고 싶습니다. 다음 코드를 시도했지만 clazz가 CodeObject를 구현하는 클래스라는 보장은 없습니다.

myMethod(Class<? extends BasicObject> clazz){...}

나는 이와 같은 것을하고 싶지만 컴파일되지 않습니다.

myMethod(Class<? extends BasicObject implements CodeObject> clazz){...}

패턴 클래스는 확장 BasicObject및 확장 / 구현해야합니다 CodeObject(실제로는 인터페이스). 다음과 같이 메서드 서명의 와일드 카드 정의에 선언 된 여러 클래스로이를 수행 할 수 있습니다.

public <T extends BasicObject & CodeObject> void myMethod(Class<T> clazz)

다음 방법 중 하나를 수행하면 작동하지 않습니다.

  • public <T extends BasicObject, CodeObject> void myMethod(Class<T> clazz)

    이것은 기술적으로 유효한 구문이지만 CodeObject사용되지 않습니다. 이 메서드는 BasicObject확장 / 구현 여부에 관계없이 확장되는 모든 클래스를 허용합니다 CodeObject.

  • public void myMethod(Class<? extends BasicObject & CodeObject> clazz)
    public void myMethod(Class<? extends BasicObject, CodeObject> clazz)

    이것은 Java에 따르면 잘못된 구문입니다.


여기에 약간 장황하지만 제네릭 두통을 피하는 접근 방식이 있습니다. 확장 / 구현을 수행하는 다른 클래스를 만듭니다.

public abstract class BasicCodeObject 
    extends BasicObject 
    implements CodeObject {...}

그런 다음 방법은 다음과 같습니다.

public <T extends BasicCodeObject> void myMethod(Class<T> clazz) {...}

확장 및 구현 하는 메서드 인수 또는이를 수행하는 클래스 개체에 클래스 유형 을 전달할지 여부에 따라 문제에 대한 두 가지 접근 방식이 있습니다 . 둘 다에 대한 솔루션이 있습니다.BasicObjectCodeObject

해결책 1 :

Class자체 를 전달하려면 @bontade의 설명대로이를 수행 할 수 있습니다.

public <R extends BasicObject & CodeObject> void myMethod(Class<R> clazz)

class객체 를 전달하려면 다음과 같이 작성할 수 있습니다.

public <R extends BasicObject & CodeObject> void myMethod(R clazz)

위는 제네릭을 다루는 더 복잡한 방법입니다.

해결책 2 :

다음은 더 간단한 것입니다. 확장하고 구현하려는 클래스를 확장하는 추상 클래스를 정의 할 수 있습니다.

public abstract class TargetClassType extends BasicObject implements CodeObject {

}

이제 Class 자체를 통과하려면

public void myMethod(Class<TargetClassType> clazz)

또는 클래스 객체를 전달하려면

public void myMethod(TargetClassType clazz)

위의 솔루션 중 하나가 귀하의 질문에 적합하지만 두 번째 솔루션이 더 간단합니다.


모든 BasicObject가 CodeObject를 구현하지 않는 경우 메서드에서 instanceof / Class.isInstance () 체크인을 사용할 수 있습니다 ( http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class 참조). .html ) :

myMethod(Class<? extends BasicObject> clazz)
{
    if (!clazz.isInstance(CodeObject))
    {
        (indicate that the call was incorrect)
    }
    ...
}

참고 URL : https://stackoverflow.com/questions/10641584/method-argument-extends-class-implements-interface

반응형