【问题标题】:How to prevent type erasure?如何防止类型擦除?
【发布时间】:2013-11-27 18:52:54
【问题描述】:

我有一个我想重构的方法,它看起来(嗯,非常简化)如下:

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&lt;A, B&gt;知道的所有内容?如果是这样,那么重构的最佳方法是什么? (或者是否需要重构)

【问题讨论】:

  • 我会使用你的第一种方法。但是我会用throw new IllegalArgumentsException("message");替换return -1;

标签: java generics compilation refactoring type-erasure


【解决方案1】:

在编译时Java会erase泛型的类型信息。没有办法阻止这种情况。在运行时,Pair 没有&lt;A,B&gt;,实际上是&lt;Object,Object&gt;

至于重构它,您可能更喜欢一些事情(但除了一个建议)在您的示例中没有太多可以改进的地方 - 我可能会使用一个 else (如果最后一行不能发生。我会使用 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.
}

【讨论】:

  • 嗯,也没有Pair&lt;Object, Object&gt;。删除后只有Pair
  • @RohitJain 是的。有效地添加以澄清。
  • @ElliottFrisch 你对重构我发布的方法有什么建议吗?
  • @DavidT。我添加了两个(小)建议。
【解决方案2】:

我要补充一下

private int foo(Pair<String, String>... params) {
    return 0;
}

private int foo(Pair<String, ArrayList>... params) {
    return 1;
}

如果允许此代码,它就没有多大用处。你知道你传递给 foo 的类型。它是引用的类型,而不是实际对象的类型。因此,只需将所有调用 Pair&lt;String, String&gt; 的地方都替换为 0

也就是说,调用哪个方法应该在编译时就可以确定。不是在运行时。如果在编译时就可以确定,则根本不需要调用该方法。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多