当前位置: 首页 > 面试题库 >

Java名称冲突,具有相同的擦除方式,但两者都不隐藏

乜坚成
2023-03-14
问题内容

我收到此名称冲突错误,我不知道该怎么解决。我有两个类,我正在使用重载的方法“ 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;
   }
}

问题答案:

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

如所指出的,问题中的方法实现是相同的(典型值除外)。

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



 类似资料:
  • 我有一个接口,当我尝试实现它的一个方法时,我得到了这个错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但两者都不重写另一个,其中T#1,T#2是类型变量:T#1扩展在类GenericQueue中声明的Comparable T#2扩展在接口IGenericQueue中声明的Comparable”下面是代码:

  • 问题内容: 我有超一流的Foo。还有一个扩展它的类Bar。 在Foo中的功能: 酒吧功能: 出现错误: 我究竟做错了什么? 问题答案: 您正在使用不兼容的类型覆盖该方法。也许您想做类似的事情: 功能在 和功能在酒吧:

  • 问题内容: 我想要一个带有Real的compareTo方法(一个用于处理任意大而精确的实数的类[好吧,只要它现在的长度小于2 ^ 31])和一个带有一个对象,但是Java不允许我这样做,而且我还没有足够的经验来知道为什么。 我只是试图修改该类以实现Comparable,并且在下面得到了这些错误消息。我不是很明白错误消息的含义,但是我知道这与我试图为类制作的每个方法提供所有不同方法签名的灵活性的可怕

  • 问题内容: 我有一个接口,当我尝试实现其方法之一时,出现以下错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但是没有覆盖T#1,T#2是类型变量的另一个:T#1扩展了在类GenericQueue中声明的Comparable T#2扩展了在接口IGenericQueue中声明的Comparable,这是代码

  • 我有以下代码,但它不起作用:出现。 我还有这个代码: 这是可行的。在第一种情况下,是,就像在第二种情况下是。那么为什么第一种情况会导致错误,而第二种情况会成功编译? 编辑:我应该怎么做才能实现方法重载,而不引发错误?

  • 我改变了切入点的顺序,它总是排在第二位。关于如何解决这个问题有什么想法吗? 更新 一旦我发布了这个问题,我就有了一个想法。我这样更改了切入点: 现在异常消失了,但仍然有一个小问题(我想这个问题更容易解决):因为ArrayList实现了可序列化,所以至少在我使用ArrayList的测试用例中,两个切入点都被执行了。 我将对此进行研究,并发布我的发现,但也感谢您的帮助;) 我将代码改为只使用一个切入点