我有一个通配符对象列表,并希望将迭代算法与项目处理分开,这取决于列表中包含的对象类型。
确定item
列表中items
的类型并分派到相应的doSomething
方法的最佳方法是什么?
private void iterateListAlgo (List<?> items) {
for (int i = 0, len = items.size(); i < len; i++) {
//... lalala
doSomething(items.get(i));
}
}
private void doSomething (ClassA item) {
//... lalala
}
private void doSomething (ClassB item) {
//... lalala
}
// etc.
编译它会给我一个错误:
required: ClassA
found: CAP#1
reason: argument mismatch; Object cannot be converted to ClassA
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?
我更倾向于将类型转换保留在iterateListAlgo
函数之外,但我甚至不确定如何做到这一点。
答案 0 :(得分:4)
在java中执行此操作的方法是让ClassA
和ClassB
实现具有方法doSomething()
的公共接口。 E.g,
interface CanDoSomething {
public doSomething();
}
class ClassA implements CanDoSomething {..}
class ClassB implements CanDoSomething {..}
private void iterateListAlgo(List<CanDoSomething> items) {
for (CanDoSomething item : items) {
item.doSomething();
}
}
答案 1 :(得分:2)
使用instanceof
可以确定对象是哪个类:
if(items.get(i) instanceof ClassA)
doSomething((ClassA)items.get(i));
编辑:这是一个可能的解决方案,但是我认为Hari Shankar发布的界面解决方案是一种更清洁,更好的方法。
答案 2 :(得分:0)
您可以随时执行if语句,然后让每个块都基于
if(objA instanceof classA)
{
\\Do Something to objA relevant to classA
}
elseif(objA instanceof classB)
{
\\Do Something to ObjA but relevant to classB
}