2016-06-13 11 views
0

와일드 카드/제네릭 사용에 어려움을 겪고 있습니다. 사용자 지정 Java Beans를 받아 들일 수 있고 파일에 Bean을 쓰거나 쓸 수있는 FileManager 유틸리티 클래스를 만들려고합니다. 예를 들자면, 과 DemographicData으로 구현 된 Data이라는 인터페이스가 있습니다. Super CSV을 사용하여 CSV 파일을 Java Bean으로 변환합니다. 여기에 Super CSV에서 찾은 튜토리얼 코드를 기반으로하는 내 읽기 방법이 있습니다.Java : 와일드 카드/generics 관련 문제

public interface Data { method declarations } 
public class RecipeData implements Data { class stuff goes here } 
public class DemographicData implements Data { class stuff goes here } 

final public class FileManager { 
    public static void parseCsvFile(String filename, CellProcessor[] processors, String[] nameMappings, List<? extends Data> container) { 
     ICsvBeanReader beanReader = null; 
     try { 
      beanReader = new CsvBeanReader(new FileReader(filename), CsvPreference.STANDARD_PREFERENCE); 

      Data data; 
      while((data = beanReader.read(Data.class, nameMappings, processors)) != null) { 
       container.add(data); 
      } 
     } finally { 
      if (beanReader != null) { 
       beanReader.close(); 
      } 
     } 
    } 
} 

현재, 나는 다음과 같은 오류 받고 있어요 :

The method add(capture#1-of ? extends Data) in the type List is not applicable for the arguments (Data)

내가 뭘하는지 모르겠어요 심지어 가능하다. 생각하면, 전달되는 containerRecipeData 또는 DemographicData 일 수 있습니다. 그래서 하나의 문제는 data이 두 가지 유형이어야한다는 것입니다.

아무도 내가 잠재적으로이 문제를 해결할 수있는 방법에 대한 의견을 제시 할 수 있습니까?

편집 : 나는 이것이 가능하다는 것을 정말로 확신하지 못합니다.

+3

일반에서'확장 '이라고 -'RecipeData'와'DemographicData'가'Data' 인터페이스를 구현하고 확장하지 않기 때문에'Data' 여야합니다. 이렇게하면 "인터페이스를 유형으로"패턴을 사용합니다. 그건 그렇고,'writeToCsvFile' 함수를 어디로 보내고 있는지 알려주시겠습니까? – ishmaelMakitla

+2

[여기] (http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)에서 설명한대로 PECS 원리를 살펴보십시오. 요약 : 컬렉션에 요소 만 추가하려면 Collection '. –

+0

안녕하세요, 클래스 또는 사용중인 인터페이스 여부에 관계없이 확장을 사용하여 꽤 확신 해요. 'nameMappings'과 'processors'는 잘 동작합니다. 비 제너럴 쓰기 함수에서 상당히 테스트 했으므로 문제는 아닙니다. '컨테이너'까지 전달하면 다른 클래스에서 'List container = new ArrayList ();'으로 선언됩니다. –

답변

0

List<? extends Data> container에 와일드 카드를 사용하는 대신 List<Data> container을 사용하십시오.

+1

그 이유를 설명하면 답이 더 유익 할 것입니다. – VGR