我試圖實作的目標是擁有不同的 FileLoader,如 CSVFileLoader、ExcelFileLoader,它們可以加載任何 T 型別的物件,只要它知道如何使用“C”進行轉換并創建 T 型別的物件。希望這能讓感覺。
我正在嘗試使用泛型來創建一個泛型 FileLoader,它將采用 C 型別的轉換器并回傳 T 型別的物件串列。所以我開始創建類似下面的內容,但它會按預期作業。
嘗試在 convert 方法中回傳物件 Transaction 時出現錯誤。我應該如何重寫它以便它可以使用泛型并且我可以改進此代碼以使其正常作業。我知道有型別擦除,所以這就是為什么它在下面的代碼中抱怨但不知道如何修復它。請指教
//FileLoader takes a converter of type C, Object of type T
public interface FileLoader<T,C> {
List<T> load();
}
//Converter return a list of objects of type T
public interface Converter<T> {
List<T> convert(Iterable<CSVRecord> csvRecords);
}
因此,使用上述介面,我嘗試實作我的類,但顯然我出錯了,所以我的理解不是很好,我想知道我哪里出錯了。
public class TransactionConverter<T> {
public List<T> convert(Iterable<CSVRecord> records) {
List<T> transactions = new ArrayList<>();
for(CSVRecord r: records){
T t = convert(r);
transactions.add(t);
}
return transactions;
}
private T convert(CSVRecord r){
//TradeDate,Symbol,Buy/Sell,Quantity,TradePrice
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate transactionDate = LocalDate.parse(r.get(0), formatter);
String ticker = r.get(1);
TransactionType transactionType = TransactionType.valueOf(r.get(2));
Double amount = Double.parseDouble(r.get(3));
Double quantity = Double.parseDouble(r.get(4));
//getting ERROR HERE
return new Transaction(ticker, "",transactionDate, transactionType, amount, quantity);
}
}
public class CSVFileLoader<T,C> implements FileLoader<T,C> {
private String filePath;
private TransactionConverter converter;
private Logger logger = LoggerFactory.getLogger(CSVFileLoader.class);
public CSVFileLoader(String filePath, TransactionConverter converter){
this.filePath = filePath;
this.converter = converter;
}
@Override
public List<T> load() {
List<T> transactions = null;
Reader in = null;
Iterable<CSVRecord> records;
try {
in = new FileReader(filePath);
records = CSVFormat.RFC4180.withHeader("ID", "CustomerNo", "Name").parse(in);
transactions =converter.convert(records);
} catch (FileNotFoundException e) {
logger.info("Unable to load file " filePath);
} catch (IOException e) {
e.printStackTrace();
}
return transactions;
}
}
uj5u.com熱心網友回復:
問題中的源代碼TransactionConverter沒有實作介面Converter。因為它試圖用 的具體型別來實作它Transaction,所以它應該在implements子句中指定它并且不應該為自己宣告一個型別引數。它應該使用的具體型別的Transaction任何地方T在使用 Converter。這是結果來源:
public class TransactionConverter implements Converter<Transaction> {
@Override
public List<Transaction> convert(Iterable<CSVRecord> records) {
List<Transaction> transactions = new ArrayList<>();
for(CSVRecord r: records){
Transaction t = convert(r);
transactions.add(t);
}
return transactions;
}
private Transaction convert(CSVRecord r){
//TradeDate,Symbol,Buy/Sell,Quantity,TradePrice
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate transactionDate = LocalDate.parse(r.get(0), formatter);
String ticker = r.get(1);
TransactionType transactionType = TransactionType.valueOf(r.get(2));
Double amount = Double.parseDouble(r.get(3));
Double quantity = Double.parseDouble(r.get(4));
//getting ERROR HERE
return new Transaction(ticker, "",transactionDate, transactionType, amount, quantity);
}
}
介面中C沒有使用型別引數FileLoader,因此是多余的。使用轉換器的事實是CSVFileLoader此代碼中的實作細節。這是更新后的介面宣告:
public interface FileLoader<T> {
List<T> load();
}
如果我理解您的意圖,CSVFileLoader應該能夠使用 的任何實作Converter,但它目前需要一個TransactionConverter. 它還使用transactions結果串列的名稱,但Transaction如果使用另一種型別的,這些可能不是物件Converter。這是更新的實作:
public class CSVFileLoader<T> implements FileLoader<T> {
private String filePath;
private Converter<T> converter;
private Logger logger = LoggerFactory.getLogger(CSVFileLoader.class);
public CSVFileLoader(String filePath, Converter<T> converter) {
this.filePath = filePath;
this.converter = converter;
}
@Override
public List<T> load() {
List<T> convertedRecords = null;
Reader in = null;
Iterable<CSVRecord> records;
try {
in = new FileReader(filePath);
records = CSVFormat.RFC4180.withHeader("ID", "CustomerNo", "Name").parse(in);
convertedRecords = converter.convert(records);
} catch (FileNotFoundException e) {
logger.info("Unable to load file " filePath);
} catch (IOException e) {
e.printStackTrace();
}
return convertedRecords;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311169.html
