2013-12-14 3 views
5

"ClassA"클래스의 인스턴스이지만 "InterfaceI"인터페이스를 구현하는 클래스에 변수가 있어야합니다.클래스 A를 확장하고 일부 인터페이스를 구현해야하는 멤버 변수

는 분명히 이것은 하나 쉽게 다른 위해 수행 할 수 있습니다

private ClassA mVariable; 
private InterfaceI mVaraible; 

하지만 어떻게 적용 할 수 있습니다 개체 모두를 ClassA를 확장하고는 InterfaceB를 구현? 같은 뭔가 :

private <? extends ClassA & InterfaceI> mVaraible; 

내가 필요하지만 난 구문의 아무 생각이 없다거나 심지어 가능한 경우. 나는 또한 GET 및 설정 방법이 필요합니다,하지만이 (내가 생각하세요?) 제네릭 수행 할 수 있습니다

확실한 해결책이, 그러나 InterfaceI과를 ClassA 모두 외부 libary의 일부

public class ClassB extends ClassA implements InterfaceI{ 
    //whatever here 
} 

입니다 libary에는 ClassA와 InterfaceI를 확장하는 클래스가 있으며 ClassB를 확장하도록 편집 할 수 없으므로이 솔루션은 작동하지 않습니다.

+1

당신은 할 수 없습니다, 기본적으로. 변수를 설정할 때이를 확인한 다음 필요할 때 캐스팅 할 수는 있지만 클래스를 일반화하지 않고 변수 자체에 해당 제약 조건을 표현할 수는 없습니다. –

+0

Java8에는 다중 상속이나 일종의 믹스를 허용하는 마법이 있습니다. – Thufir

+0

@Jon Skeet 변수를 설정할 때 어떻게 확인합니까? – jtedit

답변

1

나는 다소 해로운 해결 방법을 발견했습니다.

private ClassA mItemClassA; 
private InterfaceI mItemInterfaceI; 

내용물 방법은 다음과 같다 : 다음과 같이

클래스는를 ClassA 및 InterfaceI 기준 모두 포함

public void setVaraible(ClassA item){ 
    assert (item instanceof InterfaceI); 
    mItemClassA = item; 
    mItemInterfaceI = (InterfaceI) item; 
} 
이러한

다른 변형은, 예외를 발생 false를 반환 할 수있다 , 등 항목이 InterfaceI의 인스턴스가 아닌 경우

클래스의 다른 메서드는 mItemClassA를 사용하여 InterfaceI 및 ClassA에서 함수를 호출 할 수 있습니다. nd mItemInterfaceI.

지금은 get 메소드를 구현하지 않을 것입니다.하지만 그렇게했다면 인터페이스를 얻기위한 버전과 클래스를 가져올 버전이 있어야 할 것입니다.

+0

대신 예외를 사용할 것입니다. 어설 션은 기본적으로 검사되지 않습니다. 당신이 켜야 할 여분의 깃발입니다. +1 btw. –

0

은이 같은 일반적인 클래스 유형이 작업을 수행 할 수 있습니다

private class ClassB <R extends ClassA & InterfaceI> { 
    R mVaraible; 
}