와일드 카드/제네릭 사용에 어려움을 겪고 있습니다. 사용자 지정 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)
내가 뭘하는지 모르겠어요 심지어 가능하다. 생각하면, 전달되는 container
은 RecipeData
또는 DemographicData
일 수 있습니다. 그래서 하나의 문제는 data
이 두 가지 유형이어야한다는 것입니다.
아무도 내가 잠재적으로이 문제를 해결할 수있는 방법에 대한 의견을 제시 할 수 있습니까?
편집 : 나는 이것이 가능하다는 것을 정말로 확신하지 못합니다.
일반에서'확장 '이라고 -'RecipeData'와'DemographicData'가'Data' 인터페이스를 구현하고 확장하지 않기 때문에'Data' 여야합니다. 이렇게하면 "인터페이스를 유형으로"패턴을 사용합니다. 그건 그렇고,'writeToCsvFile' 함수를 어디로 보내고 있는지 알려주시겠습니까? – ishmaelMakitla
[여기] (http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)에서 설명한대로 PECS 원리를 살펴보십시오. 요약 : 컬렉션에 요소 만 추가하려면 Collection 슈퍼 데이터>'. –
안녕하세요, 클래스 또는 사용중인 인터페이스 여부에 관계없이 확장을 사용하여 꽤 확신 해요. 'nameMappings'과 'processors'는 잘 동작합니다. 비 제너럴 쓰기 함수에서 상당히 테스트 했으므로 문제는 아닙니다. '컨테이너'까지 전달하면 다른 클래스에서 'List container = new ArrayList();'으로 선언됩니다. –