Dav*_* T. 1 java generics refactoring compilation 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
}
Run Code Online (Sandbox Code Playgroud)
所以我想我会做一些事情,比如把它分成两种方法,这样我就不用做类型检查了.(这是一个很好的重构吗?)
所以我想做这样的事情:
private int foo(Pair<String, String>... params) {
// do something
return 0;
}
private int foo(Pair<String, ArrayList>... params) {
// do something else
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但编译器一直告诉我两种foo()方法都有相同类型的擦除.java只是擦除了所Pair<A, B>知道的一切吗?如果是这样,那么重构的最佳方法是什么?(还是需要重构)
在编译时,Java将删除泛型的类型信息.没有办法阻止这种情况.在运行时,Pair没有<A,B>它是有效的<Object,Object>.
至于重构它,有一些你可能更喜欢的东西(但除了一个建议)在你的例子中没有太多可以改进的东西 - 我可能会使用一个其他的(如果最后一行不会发生.)我使用List而不是特定类型的List.
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.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |