我得到这个名称冲突的错误,我不知道我应该怎么解决这个问题。 我有两个班,我使用重载的方法“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具有相同的擦除”。
是什么让一个复杂的问题是,我们一般不会(至少我这个非常早晨没有)知道了很多关于“类型擦除”。
要长话短说:
参数类型执行在编译时类型检查(以确保类型正确性),但是在运行时忘记他们的类型的参数(以避免潜在的方法产生)。
这听起来同时简单而令人费解。 最好理解的方法就是参考以下文献:
- 什么是reifiable类型?
- 擦除如何以及在什么条件下进行的?
- 你有什么它可以在我的编码生命意味着什么想法/例子吗?
- 嗯,这很奇怪,我真的不喜欢它,但我很好奇他们为什么这样做?
希望会帮助你尽可能多地帮助了我。
具体的答案:
你的情况
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
}
}
其中一个显然不能覆盖其他的(不是同一类型的参数),但最终被在运行时(没有办法让你的程序来选择使用哪一个)完全一样。
够了这个问题,该如何解决呢? 你可以用下面的方法之一进行:
使用不同的名称: createASensors
和createBSensors
这种方法是最明显的,但似乎有点不太优雅。
添加一个参数: createSensors(Collection<? extends ClassA> list, ClassA typeDefiner)
这种方法似乎野蛮但是少一点优雅,但是在所使用的一个java.util.List
对于该方法<T> T[] toArray(T[] a)
。
检查项目的项目设置和编译器版本。 右键单击项目 - >属性 - > Java编译器。 确保合规性设置是最新的。 我已经当遵守设置被设定为1.4,而不是1.6这个问题