2012-06-23 2 views
0

Ok вот что я хочу сделать .. opencsv имеет следующий конструктор ..ява дженерики - задающие общий тип

CsvToBean<T> csv2Bean=new CsvToBean<T>(); 

В это текущая форма, она будет принимать какие-либо объект. поэтому следующие работы отлично подходят для меня.

CsvToBean<HoldbackModel> holdbackModelCsv=new CsvToBean<HoldbackModel>(); 

Я хотел бы написать общий помощник, который будет обертывать вызовы opencsv. Я хочу ограничить его любыми объектами классов, которые расширяют класс маркера CsvRecord.

public static <T extends CsvRecord> List<T> readCsvRecords(InputStream srcRecords,  InputStream templateCsv, Class<? extends T> clazz) { 
    // here i want to pass the class clazz to the CsvBean.. but don't know how!! 
    CsvToBean<T> csv2Bean=new CsvToBean<T>(); 
} 

Любая помощь?

ответ

1

Вы идете в правильном направлении, просто нужно немного настроить.

public static <T extends CsvRecord> List<T> readCsvRecords(InputStream srcRecords, InputStream templateCsv) { 
    CsvToBean<T> csv2Bean = new CsvToBean<T>(); 
} 
+1

Вам не нужен параметр Class, потому что параметры Java Generic не являются объектами, которые вы передаете во время выполнения. Они просто намекают на компилятор. Во время компиляции, когда вы пытаетесь вызвать readCsvRecords, Java будет смотреть на сайт вызова и попытаться вывести тип для T. Он должен расширять CsvRecord, потому что вы так сказали. Вот и все. Все остальные ссылки на T не ограничены. Когда вам нужно передать объект класса? Предположим, вы хотели вернуть T вместо списка . Вам, возможно, придется отбрасывать на T. Тогда для этого требуется метод реального объекта класса. –

Смежные вопросы