我正在尝试创建一个将对象的ArrayLists转换为其他对象的ArrayLists的类。即。
ArrayList<Foo> convert(ArrayList<Bar> input){
//conversion logic
}
ArrayList<Bar> convert(ArrayList<Foo> input){
//conversion logic
}
不幸的是,Java不希望有两个具有相同名称的功能以及它认为相同的输入和输出。
我正试图走另一条路。而不是多个具有相同名称的函数,我想创建一个接受ArrayList的函数,确定哪个类型的对象在里面,进行正确的转换,并返回一个ArrayList:
ArrayList convert(ArrayList input){
//conversion logic for Foo
//conversion logic for Bar
}
这样的事情可能吗?
答案 0 :(得分:4)
界面怎么样:
public class Converter<From, To> {
List<To> convert(List<From> input);
}
然后拥有您想要的任意数量的实现。例如:
private static final Converter<Foo, Bar> fooToBarConverter = new Converter<Foo, Bar>() {
public List<Bar> convert(List<Foo> input) {
...
}
}
答案 1 :(得分:4)
尝试:
public <T, U> ArrayList<U> convert(Class<T> typeIn, ArrayList<T> input){
// dispatch on typeIn
}
或者更好
public <T, U, V extends ArrayList<U>> V convert(Class<T> typeIn,
Class<V> typeOut, ArrayList<T> input){
// dispatch on typeIn
return typeOut.cast(yourConversionResult);
}
因为您可能在同一方法中返回ArrayList<Foo>
或ArrayList<Bar>
,并且正确的强制转换将帮助您在没有编译器警告的情况下返回它们。
编辑:第二个示例的返回类型转换不起作用。试图解决它
答案 2 :(得分:0)
您基本上是在功能编程方面描述“地图”。获取对象列表,对每个对象应用一些操作,并将结果累积到另一个列表中。有些库已经实现了这些东西,虽然我最近没有看过。我知道commons集合有这个用于pre-generics集合。
解决方案的要点是(类似于mmeyers解决方案):
public interface Function<From,To> {
public To apply(From);
}
public <From,To> List<To> map(List<From> fromList, Function<From,To> fun) {
// call fun.apply() on every element in fromList and return a new result list ...
}