我对Generics相当陌生,非常感谢您的帮助。我有办法
1 public static List<classA> convertA(List<List<Object>> dataframe) throws Exception {
2 List<classA> objA = new ArrayList<classA>();
3 for (List<Object> objs : dataframe) {
4 if (objs != null) {
5 classA a = new classA();
6 //generic logic to set value from objs to object `a` irrespective of type of `a`.
7 objA.add(a);
8 }
9 }
10 return objA;
11 }
该方法基本上将的值分配List<List
使用通用方法的解决方案 将通用方法定义为
public static <T> List<T> convertGeneric(List<List<Object>> dataframe, Function<Object, T> converter)
也就是说,第一个参数是您的对象集合,第二个参数是您提供从Object到目标类的转换函数。该方法返回一个List 。(请注意, 之后static需要声明一个通用方法。
该方法的实现可以是
List<T> result = new ArrayList<>();
for (List<Object> objects : dataframe) {
for (Object object : objects) {
T t = converter.apply(object);
result.add(t);
}
}
return result;
}
或使用流的另一个:
public static <T> List<T> convertGeneric(List<List<Object>> dataframe, Function<Object, T> converter) {
return dataframe.stream()
.flatMap(Collection::stream) // get the objects from the inner list
.map(converter) // convert object to T
.collect(Collectors.toList()); // put everything in a new list
}
转换功能可以实现为lambda,例如
Function<Object, Foo> fooLambda = object -> {
Foo foo = new Foo();
// logic for mapping obj to foo
return foo;
};
和转换List<List<Object>>
到List<Foo>
变为: List<Foo> fooList = GenericMethodConverter.convertGeneric(dataFrame, fooLambda);
我认为您为这个问题而苦苦挣扎的原因是,您试图在通用方法中进行所有操作(抽象和具体部分)。您已经知道,泛型方法随后需要其他信息才能使用哪种具体实现(在您的版本中,将转换的目标类型作为第二个参数传递)。在上述解决方案中,通用方法需要转换函数Function<Object,T>,即将对象映射到目标类型T的函数。通用方法将此函数应用于所有对象,并将结果放入返回的列表中。用于映射的具体实现object为Foo作为从而reifying通用lambda表达式被供给T到Foo。可以根据需要添加其他转换功能。
另一种方法 这是使用面向对象/类而不是静态方法的解决方案:
定义一个抽象基类GenericConverter,其中包含要遍历列表的迭代,并声明一个抽象方法如何将an转换Object为目标类型:
public abstract class GenericConverter<T> {
public List<T> convertGenerically(List<List<Object>> dataFrame) {
List<T> tList = new ArrayList<>();
for (List<Object> objectList : dataFrame) {
for (Object obj : objectList) {
T t = convert(obj);
tList.add(t);
}
}
return tList;
}
protected abstract T convert(Object obj);
}
为每个目标类添加一个实现,例如,转换Object为Foo:
public class FooConverter extends GenericConverter<Foo> {
@Override
protected Foo convert(Object obj) {
Foo foo = new Foo();
// logic for mapping obj to foo
return foo;
}
}
然后Objects通过调用实现类的方法来转换: List<Foo> foos = fooConverter.convertGenerically(dataFrame);
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。