2013-06-04 3 views
1

호출자가 제공 한 도우미 개체를 사용하여 대상 데이터 구조로 로딩을 지원하는 일반 구성 로더를 작성하려고합니다. 도우미는 데이터 구조에 대한 지식으로부터 로더를 분리하고, 멤버 값을 사전 처리하고, 하부 구조를 만들고, 구조에 멤버를 추가/제거하는 메소드와 함께 사용됩니다.동일한 유형의 정적 중첩 클래스가있는 일반 클래스

public class ConfigLoader<T extends Object> 
... 
private final Class<T>     stcClass; 

와 정적 중첩 된 인터페이스 :

static public interface Helper<T> 
{ 
public Object configValue(String qulfld    , String loc); 
public Object configValue(String qulfld, T   val, String loc); 
public Object configValue(String qulfld, String  val, String loc); 
public Object configValue(String qulfld, Boolean val, String loc); 
public Object configValue(String qulfld, Number  val, String loc); 

public T  crtObject(); 
public void addMember(T tgt, String fld, Object val); 
public void rmvMember(T tgt, String fld); 
} 

및 기본 생성자 :

private ConfigLoader(JsonParser psr, Helper<T> hlp, DataStruct vld) { 
    super(); 

    parser  =psr; 
    helper  =hlp; 
    stcClass =helper.crtObject().getClass(); // <== error here 
    validation =vld; 
    errors  =new ArrayList<Fail>(); 
    } 

내가 컴파일러 오류가 점점 오전 클래스와 변수 선언을 감안할 때

생성자 행은 다음과 같습니다.

ConfigLoader.java:79: error: incompatible types 
    stcClass =helper.crtObject().getClass(); 
              ^
    required: Class<T> 
    found: Class<CAP#1> 
    where T is a type-variable: 
    T extends Object declared in class ConfigLoader 
    where CAP#1 is a fresh type-variable: 
    CAP#1 extends Object from capture of ? extends Object 
1 error 

목적은 다음 구조 유형을 확인하는 다른 코드를 사용하고 T 인수 helper.configValue(qulnam,stcClass.cast(val),loc.toString())을 사용와 헬퍼 분 메소드를 호출 Class<T> 객체를 추출되는 전방 최대 하나 개의 더미 구조를 만드는 것이다 . 컴파일러는 도우미의 crtObject 메소드의 반환이 생성자에 전달 된 도우미는 자체가 Helper<T> 때문에 사실에 T 대상이 보장되는 것을 확인 할 수없는 이유

은 내가 알아낼 수 없습니다 같습니다.

내가보기에 유일한 대안은 생성자 인수로 Class<T>을 전달하는 것입니다.

도움을 주시면 감사하겠습니다.

+2

* 내가보고하고있는 유일한 대안이 같은'클래스 '에 전달하는 다음과 같이 위해

컴파일러 오류를 제거하기 위해, 당신은 지금 안전 Class<? extends T>helper.crtObject().getClass(); 전송할 수 있습니다 constructor argument. * 예, 타입 소거로 인해 클래스 타입을 알 수있는 다른 방법은 없습니다. 또한' '를 사용하는 것은' '와 동일합니다. –

+0

무엇이'stcClass'입니까? –

+0

도우미 클래스에 대상 클래스 개체가 있어야 인스턴스화 할 수 있습니다. 다음과 같이 정적 팩토리 메서드를 사용하면됩니다. public static Helper forClass (Class ) {etc(); }' – fge

답변

1

stctype 유형을 <? extends T>으로 선언 할 수 있습니다.

private final Class<? extends T> stcType; 

이것은 stctypeT 또는 T의 서브 클래스를 처리 할 수 ​​있는지 확인합니다.

stcClass = (Class<? extends T>) helper.crtObject().getClass(); 
+0

내가 결정한 것은 클래스를 전달하는 대신 헬퍼에게 메소드를 전달하는 것이 었습니다. 클래스를 전달하는 대신 클래스를 반환하는 것이 가장 깨끗해 보였고 유형별 코드를 모두 유지했습니다. –