Java名称冲突,具有相同的擦除,都不会隐藏另一个
我得到这个名字冲突错误,我不知道我应该如何解决这个问题。 我有两个类,我使用重载方法“createSensors”。 这里简化是产生问题的代码:
public abstract class ClassA { public static List createSensors(Collection list) { List sensors = new ArrayList(); for (ClassA s : list) { sensors.add(s.getSensor()); } return sensors; } } public abstract class ClassB extends ClassA { public static List createSensors(Collection list) { List sensors = new ArrayList(); for (ClassB s : list) { sensors.add(s.getSensor()); } return sensors; } }
一般的解决方案是使用不同的名称。 这些方法可以在没有inheritance关系的类中,因为它们不是实例方法。
正如所指出的,问题中的方法实现是相同的(错误除外)。
(这个重载问题经常与运行时类型的擦除混淆。重载是一个链接时间而不是动态问题,所以可以很容易地用语言修复。这不是一个特别有用的改变,也不是一个好主意鼓励超载)。
一般答案:
除了这里相同实现的问题之外,问题的核心是,有点野蛮,“方法A和方法B具有相同的擦除”。
使它成为一个复杂问题的原因是我们通常不会(至少我今天早上没有)对“类型擦除”有很多了解。
简而言之:
参数类型在编译时执行类型检查(以确保类型正确性)但在运行时忘记它们的类型参数(以避免生成基础方法)。
这听起来简单而令人费解。 理解它的最佳方式是参考以下文献:
- 什么是可再生类型?
- 如何以及在什么条件下进行擦除?
- 关于它在我的编码生活中可能意味着什么,你有什么想法/例子吗?
- 那很奇怪,我真的不喜欢它,但我很好奇为什么他们这样做……
希望能帮助你,就像它帮助我一样。
具体答案:
在你的情况下
public abstract class ClassA { public static List createSensors(Collection extends ClassA> list) { //do stuff } } public abstract class ClassB extends ClassA { public static List 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 } }
其中一个明显不能覆盖另一个(不是相同的类型参数)但最终在运行时完全相同(你的程序无法选择使用哪一个)。
够了这个问题,怎么解决呢? 您可以继续使用以下方法之一:
-
使用不同的名称:
createASensors
和createBSensors
这种方法最明显,但看起来不那么优雅。 -
添加一个参数:
createSensors(Collection extends ClassA> list, ClassA typeDefiner)
这种方法看起来很野蛮但有点不那么优雅但是在java.util.List
用于方法
。T[] toArray(T[] a)
检查项目设置和项目的编译器版本。 右键单击项目 – >属性 – > Java编译器。 确保合规性设置是最新的。 当合规性设置设置为1.4而不是1.6时,我遇到了这个问题