[英]How to prevent type erasure?
我有一個我想重構的方法,它看起來像這樣(非常簡化):
import com.sun.tools.javac.util.Pair;
private int foo(Pair<String, ?>... params) {
if (params[0].snd instanceof String) {
// do something
return 0;
} else if (params[0].snd instanceof ArrayList) {
// do something else
return 1;
}
return -1; // realistically in the code base, this line will never happen **edit: disregard this line
}
所以我想我會做一些事情,例如將其分為兩種方法,這樣我就不必進行類型檢查了。 (這是否是一個很好的重構?)
所以我想做這樣的事情:
private int foo(Pair<String, String>... params) {
// do something
return 0;
}
private int foo(Pair<String, ArrayList>... params) {
// do something else
return 1;
}
但是編譯器一直告訴我,兩個foo()
方法都具有相同的類型擦除。 Java是否只是擦除Pair<A, B>
知道的一切? 如果是這樣,那么重構的最佳方法是什么? (或是否需要重構)
在編譯時,Java將擦除泛型的類型信息。 沒有辦法防止這種情況。 在運行時,Pair沒有<A,B>
實際上是<Object,Object>
。
至於重構,您可能會喜歡一些事情(除了一個建議),您的示例中沒有太多可以改進的地方-我可能只用一個(如果最后一行不能發生。)我會使用列表而不是特定類型的列表。
private int foo(Pair<String, ?>... params) {
if (params[0].snd instanceof String) {
return 0;
} else { //if(params[0].snd instanceof List) { //is a List interface, not which List
// do something else
return 1;
}
// return -1; // If it can't happen, why have it here.
}
我會補充一點
private int foo(Pair<String, String>... params) {
return 0;
}
private int foo(Pair<String, ArrayList>... params) {
return 1;
}
如果允許使用此代碼,則不會有太大用處。 您知道要傳遞給foo的類型。 不管引用的類型是什么,而不是實際對象的類型。 因此,只需將所有傳遞給Pair<String, String>
0
替換為對此的所有調用。
也就是說,應在編譯時確定調用哪個方法。 不在運行時。 而且,如果它在編譯時是可確定的,則根本不需要調用該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.