我想重構我的代碼。我需要創建一個通用方法以避免重復代碼。
我創建了一個實用程式類來使用 jackson-dataformat-csv 讀取 CSV 檔案。
public class CsvUtils<T> {
final Class<T> typeParameterClass;
@Autowired
public CsvUtils(final Class<T> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}
private static final char DEFAULT_SEPARATOR = ';';
private static final String CSV_EXTENSION = ".csv";
private static final String UNDERSCORE = "_";
private static final String SOURCE_PATH = "./src/test/resources/";
public List<T> readCSV(final String fileName) throws IOException {
return readCSV(fileName, DEFAULT_SEPARATOR);
}
public List<T> readCSV(final String fileName, final char separator) throws IOException {
final Reader reader = new FileReader(SOURCE_PATH fileName CSV_EXTENSION);
final CsvMapper mapper = new CsvMapper();
final CsvSchema schema = CsvSchema.emptySchema().withColumnSeparator(separator).withHeader();
final MappingIterator<T> mappingIterator = mapper
.readerFor(typeParameterClass)
.with(schema)
.readValues(reader);
return mappingIterator.readAll();
}
}
我對每個物體類以相同的方式使用 readCSV 方法:
private List<Audi> getAudi() throws IOException {
CsvUtils<Audi> csvAudi = new CsvUtils<>(Audi.class);
return csvAudi.readCSV("Audi");
}
private List<BMW> getBMW() throws IOException {
CsvUtils<BMW> csvBMW = new CsvUtils<>(BMW.class);
return csvBMW.readCSV("BMW");
}
private List<Mercedes> getMercedes() throws IOException {
CsvUtils<Mercedes> csvMercedes = new CsvUtils<>(Mercedes.class);
return csvMercedes.readCSV("Mercedes");
}
泛型方法將是:
private static <T extends Car> List<T> getT() throws IOException {
Class<?> typeClass = ???;
CsvUtils<T> csvT = new CsvUtils<>(typeClass);
return csvT.readCSV(typeClass.getSimpleName());
}
但我不知道如何從泛型型別中提取類。
任何檔案將不勝感激!謝謝。
uj5u.com熱心網友回復:
編譯器存在型別引數以強制型別安全,如果在編譯期間它是無界的,則它被其下限或 Object 替換。在運行時,您不知道是否getT被呼叫以將其結果分配給Car,BMW或Mercedes.
這就是為什么要在運行時Class<T>訪問型別引數的實際型別時需要傳遞型別引數的原因T。
更多關于型別擦除的資訊可以在JLS或Java 教程中找到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510449.html
標籤:爪哇仿制药重构
上一篇:為什么在泛型使用時呼叫trait方法不會呼叫同名的固有方法?
下一篇:Go泛型:自參考介面約束
