18

我收到此名称冲突错误,我不知道应该如何解决这个问题。我有两个类,我正在使用重载方法“createSensors”。为了简化这里是产生问题的代码:

public abstract class ClassA {
    public static List<Sensor> createSensors(Collection<? extends ClassA> list) {
        List<Sensor> sensors = new ArrayList<Sensor>();
        for (ClassA s : list) {
           sensors.add(s.getSensor());
        }
        return sensors;
    }
}

public abstract class ClassB extends ClassA {
    public static List<Sensor> createSensors(Collection<? extends ClassB> list) {
        List<Sensor> sensors = new ArrayList<Sensor>();
        for (ClassB s : list) {
           sensors.add(s.getSensor());
        }
        return sensors;
   }
}
4

3 回答 3

13

一般回答:

除了这里实现相同的问题外,问题的核心是,有点野蛮,“方法A和方法B具有相同的擦除”。

使它成为一个复杂问题的原因是,我们通常(至少我今天早上没有)对“类型擦除”了解很多。

简而言之:

参数类型在编译时执行类型检查(以确保类型正确性)但在运行时忘记它们的类型参数(以避免生成底层方法)。

这听起来既简单又令人费解。了解它的最佳方法是参考以下文献:

  1. 什么是可具体化类型?
  2. 如何以及在什么条件下执行擦除?
  3. 您对我的编码生活可能意味着什么有任何想法/示例吗?
  4. 嗯,这很奇怪,我不太喜欢它,但我很好奇他们为什么这样做......

希望这对你有帮助,就像它对我有帮助一样。

具体答案:

在你的情况下

public abstract class ClassA {
    public static List<Sensor> createSensors(Collection<? extends ClassA> list) {
        //do stuff
    }
}

public abstract class ClassB extends ClassA {
    public static List<Sensor> createSensors(Collection<? extends ClassB> list) {
        //do other stuff
   }
}

将被javac“转换”为

public abstract class ClassA {
    public static List createSensors(Collection list) {
        //do stuff
    }
}

public abstract class ClassB extends ClassA {
    public static List createSensors(Collection list) {
        //do other stuff
   }
}

其中一个显然不能覆盖另一个(不是相同的类型参数),但最终在运行时完全相同(您的程序无法选择使用哪一个)。

这个问题够了,怎么解决?您可以继续使用以下方法之一:

  • 使用不同的名称:这种方法是最明显的createASensorscreateBSensors 但看起来不太优雅。

  • 添加一个参数:createSensors(Collection<? extends ClassA> list, ClassA typeDefiner) 这种方法看起来很野蛮,但不太优雅,但它是java.util.List用于该方法的方法<T> T[] toArray(T[] a)

于 2013-12-26T17:09:25.163 回答
5

一般的解决方案是使用不同的名称。这些方法可以在没有继承关系的类中,因为它们不是实例方法。

正如所指出的,问题中的方法实现是相同的(错字除外)。

(重载的这个问题经常与运行时类型的擦除混淆。重载是链接时问题而不是动态问题,因此可以很容易地在语言中修复。这不是一个特别有用的更改,也不是鼓励的好主意超载。)

于 2012-12-22T13:42:47.640 回答
-2

检查项目的项目设置和编译器版本。右键单击项目 --> 属性 --> Java 编译器。确保合规性设置是最新的。当合规性设置设置为 1.4 而不是 1.6 时,我遇到了这个问题

于 2014-11-05T09:35:39.720 回答