Java名称冲突,具有相同的擦除,都没有隐藏对方



我得到了此名称冲突错误,我不知道该如何解决问题。我有两个类,并且正在使用超载的方法" 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;
   }
}

一般答案:

除了这里实现相同的问题外,问题的核心是,有些野蛮的"方法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)的一种方法。

一般解决方案是使用不同的名称。这些方法可以在没有继承关系的情况下进行,因为这些不是实例方法。

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

(这个问题的问题通常与运行时类型的擦除相混淆。超载是链接时间而不是动态问题,因此可以轻松地解决该语言。这不是一个特别有用的更改,也不是一个好的更改鼓励超负荷的想法。)

检查项目设置和编译器版本。右键单击项目 ->属性 -> Java编译器。确保合规性设置是最新的。当合规设置设置为1.4而不是1.6

时,我遇到了这个问题。

相关内容

  • 没有找到相关文章

最新更新