gpt4 book ai didi

Java 名称冲突,具有相同的删除,既不隐藏另一个

转载 作者:太空狗 更新时间:2023-10-29 22:34:52 33 4
gpt4 key购买 nike

我收到此名称冲突错误,我不知道该如何解决该问题。我有两个类,我正在使用重载方法“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有相同的删除”。

使这个问题变得复杂的原因是我们通常(至少今天早上我还不知道)对“类型删除”知之甚少。

简而言之:

Parametric types perform type check at compile time (to ensure type correctness) but forget their type parameters at runtime (to avoid the generation of underlying methods).

这听起来既简单又令人费解。理解它的最好方法是引用以下文献:

  1. What is a reifiable type ?
  2. How and under what conditions is erasure performed ?
  3. Have you any idea/examples about what it could imply in my coding life ?
  4. Well that's odd and I don't really like it but I'm curious why they did that ...

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

具体答案:

在你的情况下

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 名称冲突,具有相同的删除,既不隐藏另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002965/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com