从Java中的泛型方法调用重载方法

时间:2012-10-10 13:12:00

标签: java generics overloading

我有一个Foo和Bar对象的列表,以及每个对应的转换器。

public static void Convert(Foo1 a, Bar1 b) {
...
}
public static void Convert(Foo2 a, Bar2 b) {
...
}
etc

但是,有些对象包含列表 Convert-methods需要不同,因为Bar1与Bar2和Bar3有很大的不同,依此类推,但我想创建一个方法来处理所有可能的列表。

是否可以创建一个根据列表内容调用适当的非泛型方法的泛型方法?

到目前为止,我已经尝试过这个:

public static <T, S> void ConvertList(List<T> list, List<S> libList) {
    list = new ArrayList<T>(libList.size());

    for (int i = 0; i < libList.size(); ++i) {
        Convert(list.get(i), libList.get(i));
    }
}

但是这不能编译,因为“无法解析方法'转换(T,S)'”

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不,你不能这样做 - 在编译时确定重载,听起来你想根据所涉及对象的执行时类型调用不同的方法,或者至少在T的执行时类型,这在执行时是完全未知的。

基于执行时类型的代码路径决策通常通过重载覆盖来处理,但是在这种情况下这是否可行尚不清楚。如果您可以在每个convert子类中放置适当的Foo??方法,则可能会相应地约束TS,但基本上我们没有意识到的上下文太多了那一刻。

可以在执行时使用反射来查找和调用最合适的方法,但这对代码来说会很痛苦并且可能会显着变慢。

答案 1 :(得分:0)

您必须使用运行时多态来实现此目的。

步骤1:创建代表每种类型的接口。

public  interface Foo<T> {
    public void convert(T bar);
}
public interface Bar<T> {
    public void convert(T foo);
}

第2步:创建实现类。

public class Foo1 implements Foo<Bar1> {

    @Override
    public void convert(Bar1 bar) {
        System.out.println("Foo1, Bar1");
    }
}
public public class Bar1 implements Bar<Foo1> {

    @Override
    public void convert(Foo1 foo) {
        System.out.println("Foo1, Bar1");
    }
}
public class Foo2 implements Foo<Bar2> {

    @Override
    public void convert(Bar2 bar) {
        System.out.println("Foo2, Bar2");
    }
}
public class Bar2 implements Bar<Foo2> {

    @Override
    public void convert(Foo2 foo) {
        System.out.println("Foo2, Bar2");
    }
}

步骤3:根据列表中的实例创建调用convert方法的函数。

public static <T extends Foo, S extends Bar> void convertList(List<T> list,
        List<S> libList) {

    for (int i = 0; i < libList.size(); ++i) {
        list.get(i).convert(libList.get(i));
    }
}

步骤4:创建样本列表数据并进行测试

    List<Foo<?>> listOfFoos = new ArrayList<Foo<?>>();
    List<Bar<?>> listOfBars = new ArrayList<Bar<?>>();
    listOfFoos.add(new Foo1());
    listOfFoos.add(new Foo2());
    listOfBars.add(new Bar1());
    listOfBars.add(new Bar2());
    convertList(listOfFoos,listOfBars);