Java名称冲突,有相同的擦除,两者不隐藏

2022-09-02 13:45:37

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

答案 1

一般答案:

除了这里相同实现的问题之外,问题的核心是,有点野蛮,“方法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)


答案 2

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

如前所述,问题中的方法实现是相同的(拼写错误除外)。

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


推荐