[英]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.