[英]Calling overloaded methods from generic method in Java
我有一個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)'”
有任何想法嗎?
不,您不能這樣做-重載是在編譯時確定的,這聽起來像您希望基於所涉及對象的執行時類型或至少根據執行時類型來調用不同的方法T
,在執行時完全未知。
基於執行時間類型的代碼路徑決策通常是通過重載進行覆蓋來處理的,但尚不清楚在這種情況下這是否可行。 如果可以在每個Foo??
放置適當的convert
方法Foo??
子類,您可能會相應地約束T
和S
,但基本上,目前我們尚不了解太多上下文。
您可以在執行時使用反射來查找和調用最合適的方法,但這會給代碼帶來痛苦,並且可能會大大降低速度。
您將必須使用運行時多態來實現此目的。
步驟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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.