我正在使用 java 泛型来读取 CSV 文件并创建相应的对象。我将其设置为通用,可以接受任何 CSV 文件并将其映射到一个类。
我的 CSV 中的第一行作为类名,然后我将读取其余行并为每行构建一个对象。
我正在使用CSVReader帮助我做这件事。但我收到编译错误(我在代码中标记了它们)。
这是我的方法:
public String importFromCsvFile(File f) throws IOException, ClassNotFoundException
{
FileReader fr = new FileReader(f);
BufferedReader reader = new BufferedReader(fr);
String className = reader.readLine();
//Java reflection to get the Class Object.
Class BeanClass = Class.forName(className);
// Reader reader = new FileReader("persons.csv");
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<BeanClass> entryParser = new AnnotationEntryParser<BeanClass>(BeanClass.class, provider); // BeanClass, cannot find symbol
CSVReader<BeanClass> csvPersonReader = new CSVReaderBuilder<BeanClass>(reader).entryParser(entryParser).build(); // BeanClass, cannot find symbol
List<BeanClass> beanClassList = csvPersonReader.readAll(); // BeanClass, cannot find symbol
System.out.println("First line: " + className);
return "";
}
我仍在构建我的方法,但由于这个编译错误,我无法继续。有谁知道如何修复它们? 同样,BeanClass 可以是我拥有的任何数据类,因此它必须是通用的。
谢谢!
最佳答案
您混淆了编译时已知的静态类名(如 String
或 ValueProcessorProvider
)与引用类的变量,仅在运行时已知。如果您遵循 Java 命名约定,那么区分这两者会更容易:类名以大写字母开头,变量以小写字母开头。所以代码应该是
FileReader fr = new FileReader(f);
BufferedReader reader = new BufferedReader(fr);
String className = reader.readLine();
//Java reflection to get the Class Object.
Class beanClass = Class.forName(className);
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<beanClass> entryParser = new AnnotationEntryParser<beanClass>(beanClass.class, provider); // BeanClass, cannot find symbol
CSVReader<beanClass> csvPersonReader = new CSVReaderBuilder<beanClass>(reader).entryParser(entryParser).build(); // beanClass, cannot find symbol
List<beanClass> beanClassList = csvPersonReader.readAll(); // BeanClass, cannot find symbol
System.out.println("First line: " + className);
return "";
现在您可以立即看到您正在使用变量 beanClass
,在只能使用编译时已知的文字类名的地方: <>
之间必须有什么是一个字面类名,而不是变量,因为编译器使用它来确保类型安全。我还没有检查以下代码是否可以编译,但它应该比您的尝试更接近:
FileReader fr = new FileReader(f);
BufferedReader reader = new BufferedReader(fr);
String className = reader.readLine();
//Java reflection to get the Class Object.
Class<?> beanClass = Class.forName(className);
ValueProcessorProvider provider = new ValueProcessorProvider();
CSVEntryParser<?> entryParser = new AnnotationEntryParser<>(beanClass, provider);
CSVReader<?> csvPersonReader = new CSVReaderBuilder<>(reader).entryParser(entryParser).build();
List<?> beanClassList = csvPersonReader.readAll();
System.out.println("First line: " + className);
return "";
关于java - Bean 类放入列表中 - Java 泛型 - 找不到符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273034/