2014-04-05 2 views
1

일반적인 추상 클래스 반환 형식 : 호출자바 나 자바 추상 ​​클래스가 일치하지

public Importable importable; 
// ... 
importable = new MyImportable(); // MyImportable extends Importable<String> 

이 작품 :

importData(validateData(myPaths)); 

나는이 작업을 수행 할 경우,

private abstract class Importable<T> { 

    // ... 

    public abstract List<T> validateData(List<Path> paths); 

    public abstract void importData(List<T> data); 

    // ... 

} 


private static class MyImportable extends Importable<String>{ 

    public List<String> validateData(List<Path> paths){ 
     return // valid ArrayList<String>; 
    } 

    public void importData(List<String> data){ 
     // do stuff with data 
    }  

} 

지금 하지만 원시 Importable을 좋아하지 않으므로 <?>

를 추가했습니다. 그렇게가
public Importable<?> importable; 

오류가 발생합니다 : importData(validateData(myPaths));

을 실행

The method importData(List<capture#5-of ?>) in the type ImportController.Importable<capture#5-of ?> is not applicable for the arguments (List<capture#6-of ?>) 

동안 일식이 문제

를 해결하기 위해 아무것도하지 않았다 List<?>, 캐스팅하라고 제안 나는 '무언가가 실종 됐어?

편집 :

Importable importable; 

switch(condition){ 
case 1: 
    importable= // Importable<MyType1> 
break; 
case 2: 
    importable= // Importable<MyType2> 
// .... 

} 

importData(validateData(myPaths)); 

EDIT2 :

내가 분명하지 않다 경우가 여기에 다른 종류 가져올 수 확장 나는 많은 클래스가 될 실제 사용

미안 일부 다른 클래스가 validateData

만 원하기 때문에 의도적으로 importDatavalidateData을 분리합니다. 10

문제 경우 : I 이클립스 4.3 자바 8/w 윈도우 7의 x64에 사용하고

+0

명확하지가 어디 MyImportable의 정의의 사용? –

+0

정의 추가 – tom91136

+1

확장 가능 일반 기본 클래스를 사용하는 데 무의미한 것으로 보입니다. 즉시 사용 자의 문자열에 잠급니다. –

답변

1

String

편집은 (계정으로 편집 된 질문을 복용)와 일반 인수 ? 교체 :

나는 다음과 같은 더 나은 디자인이 될 것이라고 생각한다

switch(condition){ 
case 1: 
    validateAndImport(someImportable, paths); //Importable<MyType1> 
break; 
case 2: 
    validateAndImport(someOtherImportable, paths); //Importable<MyType1> 
} 

...

<T> void validateAndImport(Importable<T> importable, List<Path> paths) { 
    importable.importData(importable.validateData(myPaths)) 
} 
+0

'public Importable ''타입 불일치 : MyImportable에서 Importable로 변환 할 수 없습니다. ' – Braj

+0

당신이 맞습니까? – Braj

+0

업데이트 대답, 나는 클래스를 인스턴스화하지 않았다 – geoand

1

이것은 당신이 MyImportableextends Importable<String>


--EDIT--

는 업데이트 된 질문에 따라,이 하나를 시도하십시오 알고있는 문제

public Importable<String> importable; 
// ... 
importable = new MyImportable(); // MyImportable extends Importable<String> 

를 해결합니다

abstract class Importable<T> { 

    public abstract List<T> validateData(List<Path> paths); 

    public abstract void importData(List<? extends Object> list); 

} 

public Importable<? extends Object> importable; 
+0

그래서 나는 수동으로'? 객체를 T로 확장? – tom91136