Java 如何转换多个函数以创建泛型函数

Java 如何转换多个函数以创建泛型函数,java,generics,Java,Generics,有没有办法将下面两个方法转换为一个泛型方法,我无法将参数传递给泛型函数初始化 public List<Obj1> csvObjConverter(Reader reader) { CsvParserSettings parserSettings = new CsvParserSettings(); parserSettings.getFormat().setLineSeparator("\n"); CsvParser parser = new CsvParse

有没有办法将下面两个方法转换为一个泛型方法,我无法将参数传递给泛型函数初始化

public List<Obj1> csvObjConverter(Reader reader) {
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    CsvParser parser = new CsvParser(parserSettings);
    parser.beginParsing(reader);
    String[] row;
    ArrayList<Obj1> objects = new ArrayList<>();
    while ((row = parser.parseNext()) != null) {
        Obj1 obj = new Obj1(row).preprocess();
        objects.add(obj);
    }
    parser.stopParsing();
    return objects;
}

public List<Obj2> csvObjConverter(Reader reader) {
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    CsvParser parser = new CsvParser(parserSettings);
    parser.beginParsing(reader);
    String[] row;
    ArrayList<Obj2> objects = new ArrayList<>();
    while ((row = parser.parseNext()) != null) {
        Obj2 obj = new Obj2(row).preprocess();
        objects.add(obj);
    }
    parser.stopParsing();
    return objects;
}
公共列表csvObjConverter(读卡器){
CsvParserSettings parserSettings=新的CsvParserSettings();
parserSettings.getFormat().setLineSeparator(“\n”);
CsvParser parser=新的CsvParser(parserSettings);
parser.beginParsing(读取器);
字符串[]行;
ArrayList对象=新的ArrayList();
而((row=parser.parseNext())!=null){
Obj1 obj=新Obj1(行).preprocess();
对象。添加(obj);
}
parser.stopParsing();
归还物品;
}
公共列表csvObjConverter(读卡器){
CsvParserSettings parserSettings=新的CsvParserSettings();
parserSettings.getFormat().setLineSeparator(“\n”);
CsvParser parser=新的CsvParser(parserSettings);
parser.beginParsing(读取器);
字符串[]行;
ArrayList对象=新的ArrayList();
而((row=parser.parseNext())!=null){
Obj2 obj=新的Obj2(行).preprocess();
对象。添加(obj);
}
parser.stopParsing();
归还物品;
}
我想执行下面的代码,但它不起作用:

public <T extends AbstractObj> List<T> csvObjConverter(Reader r, Class<T> clazz) throws IllegalAccessException, InstantiationException {
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    parserSettings.setHeaderExtractionEnabled(true);
    parserSettings.detectFormatAutomatically();
    parserSettings.setMaxCharsPerColumn(90000);
    CsvParser parser = new CsvParser(parserSettings);
    parser.beginParsing(r);
    String[] row;
    ArrayList<T> objects = new ArrayList<>();
    while ((row = parser.parseNext()) != null) {
        T obj = clazz.newInstance();    
 // i need something like -> T obj = clazz.newInstance(row);
        objects.add(obj);
    }
    parser.stopParsing();
    return objects;
}
public List csvObjConverter(读取器r,类clazz)抛出IllegaccessException,实例化Exception{
CsvParserSettings parserSettings=新的CsvParserSettings();
parserSettings.getFormat().setLineSeparator(“\n”);
parserSettings.setHeaderExtractionEnabled(true);
parserSettings.detectFormatAutomatically();
设置MaxCharsPerColumn(90000);
CsvParser parser=新的CsvParser(parserSettings);
parser.beginParsing(r);
字符串[]行;
ArrayList对象=新的ArrayList();
而((row=parser.parseNext())!=null){
T obj=clazz.newInstance();
//我需要像->T obj=clazz.newInstance(行)这样的东西;
对象。添加(obj);
}
parser.stopParsing();
归还物品;
}


你能试试这个解决方案吗

public <T> List<T> csvObjConverter(Reader reader, T object) {
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    CsvParser parser = new CsvParser(parserSettings);
    parser.beginParsing(reader);
    String[] row;
    ArrayList<T> objects = new ArrayList<>();
    while ((row = parser.parseNext()) != null) {
      T obj = new T(row).preprocess();
      objects.add(obj);
    }
    parser.stopParsing();
    return objects;
  }
公共列表csvObjConverter(读卡器,T对象){
CsvParserSettings parserSettings=新的CsvParserSettings();
parserSettings.getFormat().setLineSeparator(“\n”);
CsvParser parser=新的CsvParser(parserSettings);
parser.beginParsing(读取器);
字符串[]行;
ArrayList对象=新的ArrayList();
而((row=parser.parseNext())!=null){
T obj=新的T(行).preprocess();
对象。添加(obj);
}
parser.stopParsing();
归还物品;
}

无论何时调用此函数,都需要传递期望返回的对象类型。

需要调用非无参数构造函数,因此
clazz.newInstance()
将无法工作

尝试:

public List csvObjConverter(Reader r,Class clazz)抛出IllegaccessException、InstanceionException、InvocationTargetException、NoSuchMethodException{
CsvParserSettings parserSettings=新的CsvParserSettings();
parserSettings.getFormat().setLineSeparator(“\n”);
parserSettings.setHeaderExtractionEnabled(true);
parserSettings.detectFormatAutomatically();
设置MaxCharsPerColumn(90000);
CsvParser parser=新的CsvParser(parserSettings);
parser.beginParsing(r);
字符串[]行;
ArrayList对象=新的ArrayList();
构造函数cons=clazz.getConstructor(字符串[].class);
而((row=parser.parseNext())!=null){
T obj=cons.newInstance((对象)行);
对象。添加(obj);
}
parser.stopParsing();
归还物品;
}

“但它不起作用”。。到底是什么不起作用?代码是否未编译?在运行时引发异常?你的电脑着火了吗?请解释错误/异常。我无法编写一个可以同时使用这些函数的通用函数,并且我编写的代码不正确,这就是为什么它不工作。您使用Univocity解析器吗?是的,我使用Univocity。您不使用Univocity的
BeanListProcessor
的原因之一?它直接返回
List
s。它起作用了,但我不得不做一个这样的小改动(T obj=cons.newInstance((Object)row);),如果没有上面的改动,程序就会抛出
java.util.UnknownFormatConversionException:Conversion='error number of arguments'
,但在使用Object强制转换输入后工作,而我的构造函数参数是字符串[]@Shah92。我猜这是因为
newInstance
接受了一个vararg参数,所以传递给它的字符串数组可能被解释为多个字符串参数。
public <T extends AbstractObj> List<T> csvObjConverter(Reader r, Class<T> clazz) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    parserSettings.setHeaderExtractionEnabled(true);
    parserSettings.detectFormatAutomatically();
    parserSettings.setMaxCharsPerColumn(90000);
    CsvParser parser = new CsvParser(parserSettings);
    parser.beginParsing(r);
    String[] row;
    ArrayList<T> objects = new ArrayList<>();
    Constructor<T> cons = clazz.getConstructor (String[].class);
    while ((row = parser.parseNext()) != null) {
        T obj = cons.newInstance((Object) row);    
        objects.add(obj);
    }
    parser.stopParsing();
    return objects;
}