【发布时间】:2020-05-02 16:33:26
【问题描述】:
我有类MyClass,它使用相同的方法名进行重载:
public class MyClass {
void add(Integer val) {
// ...
}
void add(Boolean val) {
// ...
}
}
现在我想用一个额外的add 方法扩展这个类,该方法采用Collection<..>。但是,集合的内部类型必须能够作为参数传递给已经实现的add。
public class MyClass {
void add(Integer val) {
// ...
}
void add(Boolean val) {
// ...
}
void add(Collection<Object> value) {
for (Object v : value) {
add(v); // <-- ERROR here
}
}
}
当运行它时,它会以error: no suitable method found for add(Object) 失败。我确实了解为什么这不起作用。所以我的问题是,我如何指定Collection<..> 的方式是:
"接受一个内部类型有合适的
add方法的集合"
非常感谢。
--- 编辑---
找到唯一可行的解决方案是这样做:
void addIntegers(Collection<Integer> value) {
for (Integer v : value) {
add(v);
}
}
void addBooleans(Collection<Boolean> value) {
for (Boolean v : value) {
add(v);
}
}
【问题讨论】:
-
在这个特定的例子中,我想说你只需要一个
add(Object o)方法。我的意思是,你不是在调用v.add(...),而是将v作为参数传递。 -
@FedericoklezCulloca 我想更精确地处理类型,例如指定
Integer或Boolean。除了定义add(Object o),没有别的办法了吗? -
取决于您希望该方法执行的操作。就目前而言,不可能以任何其他方式回答您的问题(除了我在当前答案中看到的,您似乎不喜欢)。但是,除非你的意思是 another
add方法在参数 inside 上被调用,否则Object似乎是正确的传递,因为你看起来并不关心里面有什么add。 -
@FabioLama 您能否接受以下其中一项或解释为什么这些答案不起作用?
标签: java generics operator-overloading type-bounds