0

我有一个通配符对象列表,并希望将迭代算法与项目处理分开,这取决于列表中包含的对象类型。

确定Listitem中的类型并分派到适当的方法的最佳方法是什么?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函数之外,但我什至不确定如何做到这一点。

4

3 回答 3

4

在java中做到这一点的方法是拥有ClassAClassB实现一个具有方法的通用接口doSomething()。例如,

interface CanDoSomething {
    public doSomething();
}

class ClassA implements CanDoSomething {..}
class ClassB implements CanDoSomething {..}

private void iterateListAlgo(List<CanDoSomething> items) {
   for (CanDoSomething item : items) {
       item.doSomething();
   }
} 
于 2013-10-14T19:14:52.057 回答
2

使用instanceof您可以确定对象是哪个类:

if(items.get(i) instanceof ClassA)
    doSomething((ClassA)items.get(i));

编辑:这是一个可能的解决方案,但我认为 Hari Shankar 发布的界面解决方案是一种更清洁、更好的方法。

于 2013-10-14T19:17:49.263 回答
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
}
于 2013-10-14T19:14:17.010 回答