메서드 인수는 클래스를 확장하여 인터페이스를 구현합니다.
다음과 같은 클래스와 인터페이스가 있습니다.
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) {...}
확장 및 구현 하는 메서드 인수 또는이를 수행하는 클래스 개체에 클래스 유형 을 전달할지 여부에 따라 문제에 대한 두 가지 접근 방식이 있습니다 . 둘 다에 대한 솔루션이 있습니다.BasicObject
CodeObject
해결책 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
'IT Share you' 카테고리의 다른 글
우편 번호에서 LatLng 가져 오기-Google Maps API (0) | 2020.11.27 |
---|---|
파일이 실행 가능한지 확인 (0) | 2020.11.27 |
Docker는 OpenShift와 어떻게 비교됩니까? (0) | 2020.11.27 |
Em 기반 미디어 쿼리로 전환 (0) | 2020.11.27 |
Angularjs : ng-model이 업데이트 될 때 업데이트되지 않도록 선택 (0) | 2020.11.27 |