我有班级 MyClass
,它使用相同的方法名进行重载。
public class MyClass {
void add(Integer val) {
// ...
}
void add(Boolean val) {
// ...
}
}
现在我想扩展这个类,增加一个新的 add
方法,该方法以 Collection<..>
. 然而,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)
. I 做 明白 何以 这样做是行不通的。所以我的问题是,我如何指定 Collection<..>
以这样的方式说
"接受一个集合,其内部类型有一个合适的...
add
方法"
谢谢你
---编辑 ---
发现唯一可行的解决办法是这样做。
void addIntegers(Collection<Integer> value) {
for (Integer v : value) {
add(v);
}
}
void addBooleans(Collection<Boolean> value) {
for (Boolean v : value) {
add(v);
}
}
你可以声明通用的 T
如下
<T> void add(Collection<T> value) {
for (T v : value) {
if(v instanceof Boolean) {
add((Boolean) v);
} else if (v instanceof Integer) {
add((Integer) v);
} else {
throw new IllegalStateException("Unexpected value: " + v.getClass());
}
}
}
可以写成这样
void add(Collection<Object> value) {
for (Object v : value) {
if(v instanceof Integer){
add((int)v);
}
else if(v instanceof Boolean){
add((boolean)v);
}
}
}
但这看起来并不优雅和漂亮。