如何防止类型擦除?

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>知道的一切吗?如果是这样,那么重构的最佳方法是什么?(还是需要重构)

Ell*_*sch 5

在编译时,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)