java - 接受任何有合适方法的类型
问题描述
我有 class 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)
. 我明白为什么这不起作用。所以我的问题是,我如何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());
}
}
}
推荐阅读
- python - 如何在opencv中的HoughLinesP之后合并行
- pointers - f# 编程语言是否有像 c++ 或 pascal(引用指针)这样的指针?
- node.js - 没有字符串 Minimist Node JS
- python - 如何减少用 seaborn 绘制这个 catplot 所需的时间
- flutter - firebase 消息传递、firestore 和颤振
- twitter-bootstrap - 将 Popper 合并到 Vue/Bootstrap 项目中
- pine-script - 如何删除以前的箭头已经绘制
- c - 当我想获取初始化堆栈信息时的核心转储
- python - 在python中的字典中存储坐标
- python - 从python脚本在VSCode的第二个远程终端中运行shell命令的正确方法是什么