public <T> List<T> saveFile(File file,Class<T> c){}怎么样实现这份问题

一个文本文件中包含若干行name,sex,age,address数据,
每个数据间以逗号分割。编写方法读取文本文件将数据保存成List集合。
List中的元素类型自定义为Student。方法参数是要读取的文件的File对象和转换成的类类型。
要求使用这种方法,下面我的代码直接用的Student类作为返回参数泛型

public  List saveFile(File file,Class c){}

public class GenericInterface {

    public static void main(String[] args) {
        File f = new File("d.txt");
        List<Student> list = saveFile(f);
        for(Student s:list) {
            System.out.println(s);
        }
    }
    private static List<Student> saveFile(File file){
        List<Student> list = new ArrayList<>();
        try {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String s = "";
            while((s = in.readLine())!=null) {
                String str[] = s.split(",");
                list.add(new Student(str[0], str[1], Integer.valueOf(str[2]), str[3]));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}
class Student{
    private String name;
    private String sex;
    private Integer age;
    private String address;
    public Student() {
        super();
    }
    public Student(String name, String sex, Integer age, String address) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", sex=" + sex + ", age=" + age + ", address=" + address + "]";
    }
}


参考GPT和自己的思路:

好的,根据您的问题,我可以给您一个实现方法:

public <T> List<T> saveFile(File file,Class<T> c){
    List<T> list = new ArrayList<>();
    try {
        BufferedReader in = new BufferedReader(new FileReader(file));
        String s = "";
        while((s = in.readLine())!=null) {
            String str[] = s.split(",");
            T obj = c.newInstance();
            Field[] fields = c.getDeclaredFields();
            for(int i=0;i<fields.length;i++) {
                fields[i].setAccessible(true);
                if(fields[i].getType()==String.class) {
                    fields[i].set(obj, str[i]);
                }else if(fields[i].getType()==Integer.class||fields[i].getType()==int.class) {
                    fields[i].set(obj, Integer.valueOf(str[i]));
                }
            }
            list.add(obj);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return list;
}

这个方法接收一个File类型的参数和一个Class类型的参数,返回一个List类型的数据。在方法的实现中,我们首先通过BufferedReader从文件中读取每一行的数据,然后使用逗号分隔符将每一行数据分割成字符串数组。根据传入的Class类型参数,通过反射创建出对应类型的实例对象。然后再根据类属性名称和类型对其进行赋值。取得类的所有属性信息后,我们循环检查每个属性的类型,如果是String类型,则我们可以直接将字符串数组元素赋值给对象属性;如果是Integer类型,则需要将字符串元素转化为整型后再进行赋值,避免类型转换出现异常。

最后,将通过反射设置好属性值的对象加入到List集合中,并返回该集合。

当我们在调用该方法时,只需要传入要读取的文件和要转换为的类型即可。类的属性借助于反射技术在具体实现中进行处理,这样写的好处是我们可以通过改变类的属性内容灵活适应不同的业务需求。

希望这个答复对您有所帮助!

你这个是中文逗号 name,sex,age,address这个是英文的

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
您的代码实现了要求的读取文本文件并将数据保存到List集合中的功能。在saveFile方法中,通过BufferedReader读取文件中的每一行数据,使用String的split方法将数据按逗号分割成数组,然后将数组中的元素转换成Student对象并添加到List中。需要注意的是,在split方法中,中文逗号应该使用中文输入法输入,否则可能无法正确分割数据。

在问题描述中,要求使用泛型实现将数据保存到List集合中,并且List中的元素类型是通过方法参数指定的。在您的代码中,定义了一个泛型方法saveFile,通过Class类型参数c指定List中元素的类型,但是在方法实现中并没有使用这个参数,而是直接将元素类型写死成了Student。如果要满足问题描述中的要求,可以将方法实现修改如下:

public static <T> List<T> saveFile(File file, Class<T> c) {
    List<T> list = new ArrayList<>();
    try {
        BufferedReader in = new BufferedReader(new FileReader(file));
        String s = "";
        while ((s = in.readLine()) != null) {
            String str[] = s.split(",");
            T obj = c.getDeclaredConstructor().newInstance();
            Field[] fields = c.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                fields[i].setAccessible(true);
                String value = str[i];
                Class<?> fieldType = fields[i].getType();
                if (fieldType == String.class) {
                    fields[i].set(obj, value);
                } else if (fieldType == Integer.class) {
                    fields[i].set(obj, Integer.valueOf(value));
                } // 可以继续添加其他类型的处理
            }
            list.add(obj);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

在修改后的代码中,我们使用反射机制创建了元素类型的实例,并使用Field对象设置实例的各个属性值。由于元素类型是在方法调用时指定的,因此需要使用反射来获取该类型的属性信息并设置属性值。在这里我们只实现了String和Integer类型的属性值设置,您可以根据需要继续添加其他类型的处理。在使用反射设置属性值时,需要将字段的访问权限设置为可访问,否则会抛出IllegalAccessException异常。