java - Bean 类放入列表中 - Java 泛型 - 找不到符号

标签 java generics csv

我正在使用 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 可以是我拥有的任何数据类,因此它必须是通用的。

谢谢!

最佳答案

您混淆了编译时已知的静态类名(如 StringValueProcessorProvider )与引用类的变量,仅在运行时已知。如果您遵循 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/

相关文章:

scala - 在这种情况下,scala 的类型检查如何工作?

java - 是什么导致 javac 发出 "uses unchecked or unsafe operations"警告

perl - 当只需要字段的子集时,分割长行的高性能方法是什么

java - 网络服务 : How do I detect the endpoint that sent the message

使用种子的 Java 随机数生成器

Java 与Python 的recv() 网络函数的等价

java - 如何将 EJB 功能添加到 Eclipse 动态 Web 项目?

c# - 通用接口(interface)的非通用实现

Python删除CSV文件末尾的空格

mysql - 当加载的原始数据具有许多唯一字符时,如何将 CSV 数据加载到 MySQL 数据库中