获取Java方法分派的通配符对象的类型?

时间:2013-10-14 19:10:58

标签: java casting

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

确定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函数之外,但我甚至不确定如何做到这一点。

3 个答案:

答案 0 :(得分:4)

在java中执行此操作的方法是让ClassAClassB实现具有方法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
}