Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串转换为对象的通用方法_Java_Generics_Polymorphism - Fatal编程技术网

Java 将字符串转换为对象的通用方法

Java 将字符串转换为对象的通用方法,java,generics,polymorphism,Java,Generics,Polymorphism,我正在实现一个实用方法,该方法接受字符串作为参数,并使用泛型转换为对象。我可以用下面的代码实现,但是的弱点是需要解析的每个对象都必须有一个字符串构造函数。无法定义对象必须具有字符串构造函数。有没有其他更好的方法通过使用多态性或泛型来实现这一点 AAA.java public class AAA { private String id; private String description; public AAA(String str) { // Do p

我正在实现一个实用方法,该方法接受字符串作为参数,并使用泛型转换为对象。我可以用下面的代码实现,但是的弱点是需要解析的每个对象都必须有一个字符串构造函数。无法定义对象必须具有字符串构造函数。有没有其他更好的方法通过使用多态性或泛型来实现这一点

AAA.java

public class AAA {
    private String id;
    private String description;

    public AAA(String str) {
        // Do parsing... 
    }
实用方法。

public static <T extends Base> List<T> readFile(File file, Class<T> type) {
    List<T> collection = new ArrayList<T>();
    // Read file line by line and convert to Instance

    Constructor<T> ctor = type.getConstructor(String.class);
    T newInstance = ctor.newInstance(line);
    if (newInstance != null) {
        collection.add(newInstance);
    }   
    return collection;
}
公共静态列表readFile(文件文件,类类型){
列表集合=新的ArrayList();
//逐行读取文件并转换为实例
Constructor=type.getConstructor(String.class);
T newInstance=ctor.newInstance(行);
if(newInstance!=null){
collection.add(newInstance);
}   
回收;
}
用法:

List<AAA> list = FileUtil.readFile(file, AAA.class);
List List=FileUtil.readFile(文件,AAA.class);

我假设您的POJO类(实际包含数据的类)通常采用示例中的格式。这意味着所有字段都是
String
值。如果不是这样,我的解决方案需要一点改进

我的建议是对您描述的用例使用反射。我过去在这方面非常成功。尽管如果应用不当,反射可能会造成严重的性能损失

解析代码大致如下所示。我省略了一个方法头,因为您提供的方法头看起来已经很好了。我提供的代码将假定在
字符串[]
变量
中,我们找到了CSV文件的已解析行。包含CSV行一列的数组的每个元素

String[] line; // initialised as explained above
T newInstance = T.newInstance(); // invoke default constructor
Field[] fields = newInstance.getClass().getDeclaredFields(); // use reflection to read all fields
int count = 0;
for(Fields f : fields) {
    f.set(newInstance, line[count]);
    count++;
}
免责声明:以上代码不做任何边界检查!假设CSV行和类中的字段数具有相同的长度

字段
对象上,我通常还调用
getAnnotation
来检查字段上是否设置了某个注释。这允许您编写如下类:

public class AAAAnnotated {

    @MyCSVAnnotation
    String field1;

    @MyCSVAnnotation
    String field2;

    String field3;
}

如果您的代码检查字段是否使用注释进行注释,您甚至可以在POJO类中控制哪些字段以CSV形式加载,哪些字段保持不变。

字符串的格式是什么?或者更确切地说是你的档案。它是CSV逗号分隔的还是JSON或类似的格式。是你决定字符串的格式吗?@DanielvanHeerden它是CSV@swemon如果我理解得好,您希望编译器强制执行
readFile
方法的
Class type
参数有一个构造函数,该构造函数接受
字符串作为其唯一参数,对吗?