1

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

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

但是,有些对象包含列表。
转换方法需要不同,因为 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));
    }
}

但这不会编译,因为“无法解析方法'Convert(T,S)'”

有任何想法吗?

4

2 回答 2

1

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

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

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

于 2012-10-10T13:17:26.183 回答
0

您将不得不使用运行时多态性来实现这一点。

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

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

第二步:创建实现类。

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");
    }
}

第三步:根据列表中的实例创建调用转换方法的函数。

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);
于 2012-10-10T13:14:36.680 回答