Java的名称冲突,具有同一消失,既不隐藏其他(Java name clash, have the

2019-07-17 12:29发布

我得到这个名称冲突的错误,我不知道我应该怎么解决这个问题。 我有两个班,我使用重载的方法“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;
   }
}

Answer 1:

一般的解决方法是使用不同的名称。 这些方法可能是类,而继承关系,这些都不是实例方法。

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

(这与超载问题往往混淆运行时类型擦除。超载是一个链接时,而不是一个动态的问题,所以可以很容易地固定在语言,这只是不是一个特别有用的变化,而不是一个好主意,以鼓励超载)。



Answer 2:

一般的答案:

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

是什么让一个复杂的问题是,我们一般不会(至少我这个非常早晨没有)知道了很多关于“类型擦除”。

要长话短说:

参数类型执行在编译时类型检查(以确保类型正确性),但是在运行时忘记他们的类型的参数(以避免潜在的方法产生)。

这听起来同时简单而令人费解。 最好理解的方法就是参考以下文献:

  1. 什么是reifiable类型?
  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)



Answer 3:

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



文章来源: Java name clash, have the same erasure, neither hides the other