Bean类成一个列表--Java Generics - 找不到符号

时间:2014-03-08 18:05:36

标签: 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可以是我的任何数据类,因此它必须是通用的。

谢谢!

2 个答案:

答案 0 :(得分:1)

您在编译时已知的静态类名称(如StringValueProcessorProvider)与变量引用类相混淆,仅在运行时知道。如果您尊重Java命名约定,则更容易区分两者:类名称以upperccase latters开头,变量使用小写字母。所以代码应该是

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 "";

答案 1 :(得分:1)

在课堂上我认为BeanClass不是真正的课程。如果某个类不存在,则编译器无法编译它。你应该提供你的类(bean)来使用。你应该实施

public class BeanClass { 
    @MapToColumn(column=0)
    private String firstColumn;

请参阅http://code.google.com/p/jcsv/wiki/ValueProcessorExample