我有一个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)'”
有什么想法吗?
答案 0 :(得分:1)
不,你不能这样做 - 在编译时确定重载,听起来你想根据所涉及对象的执行时类型调用不同的方法,或者至少在T
的执行时类型,这在执行时是完全未知的。
基于执行时类型的代码路径决策通常通过重载覆盖来处理,但是在这种情况下这是否可行尚不清楚。如果您可以在每个convert
子类中放置适当的Foo??
方法,则可能会相应地约束T
和S
,但基本上我们没有意识到的上下文太多了那一刻。
你可以在执行时使用反射来查找和调用最合适的方法,但这对代码来说会很痛苦并且可能会显着变慢。
答案 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);