将多个方法重构为一个泛型方法



我想重构我的代码。我需要创建一个通用方法来避免重复代码。

我创建了一个使用jackson数据格式CSV读取CSV文件的实用程序类。

public class CsvUtils<T> {
private final Class<T> typeParameterClass;
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());
}

但我不知道如何从泛型类型中提取类。

任何文件都将不胜感激!谢谢

编译器存在用于强制类型安全的类型参数,如果在编译过程中它是无界的,则它将被其下界或Object替换。在运行时,您不知道调用getT是为了将其结果分配给CarBMW还是Mercedes的列表。

这就是为什么如果要在运行时访问实际类型的参数T,则需要传递类型为Class<T>的参数。

关于类型擦除的更多信息可以在JLS或Java教程中找到。

最新更新