检测ArrayList中的对象类型

时间:2009-06-24 18:37:26

标签: java

我正在尝试创建一个将对象的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
}

这样的事情可能吗?

3 个答案:

答案 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 ...
}