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

获取Java方法分派的通配符对象的类型?,java,casting,Java,Casting,我有一个通配符对象列表,希望将迭代算法与项目处理分开,这取决于列表中包含的对象类型 确定项目列表中项目的类型并发送到相应的doSomething方法的最佳方法是什么 private void iterateListAlgo (List<?> items) { for (int i = 0, len = items.size(); i < len; i++) { //... lalala doSomething(items.get(i)); } } priv

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

确定
项目
列表中
项目
的类型并发送到相应的
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.

我更愿意将类型强制转换排除在
iterateListAlgo
函数之外,但我甚至不知道该怎么做。

您可以始终执行if语句,然后让每个块都基于

if(objA instanceof classA)
{
 \\Do Something to objA relevant to classA
}
elseif(objA instanceof classB)
{
 \\Do Something to ObjA but relevant to classB
}

您可以始终执行if语句,然后让每个块都基于

if(objA instanceof classA)
{
 \\Do Something to objA relevant to classA
}
elseif(objA instanceof classB)
{
 \\Do Something to ObjA but relevant to classB
}

在java中实现这一点的方法是让
ClassA
ClassB
实现一个公共接口,该接口的方法是
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();
   }
} 
interface candomething{
公共剂量学();
}
类ClassA实现了CanDoSomething{..}
类ClassB实现CandoMething{..}
私有void iterateListAlgo(列表项){
用于(CandoMething项目:项目){
项目.doSomething();
}
} 

在java中实现这一点的方法是让
ClassA
ClassB
实现一个公共接口,该接口具有方法
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();
   }
} 
interface candomething{
公共剂量学();
}
类ClassA实现了CanDoSomething{..}
类ClassB实现CandoMething{..}
私有void iterateListAlgo(列表项){
用于(CandoMething项目:项目){
项目.doSomething();
}
} 

使用
instanceof
可以确定对象的类别:

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

编辑:这是一种可能的解决方案,但在我看来,Hari Shankar发布的界面解决方案是一种更干净、更好的方法。

使用
instanceof
可以确定对象的类别:

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


编辑:这是一个可能的解决方案,但在我看来,Hari Shankar发布的界面解决方案是一种更干净、更好的方法。

ClassA和ClassB之间有什么关系吗?如果你想在运行时获得对象类型,那么反射可能是一个很好的开始。它们有特定于类的方法来提取关于自身的信息,让我们说一个名字,但不要用同样的方式。@MarcusBooster我是说,在这个意义上的关系,它们的任何共同超类,或共同超接口?@MarcusBooster唉!您现在唯一的选择是
instanceof
检查并随后进行适当的强制转换。最好创建两个不同的方法,并分别传递它们。
List
List
ClassA
ClassB
之间有什么关系吗?如果您想在运行时获得对象类型,那么反射可能是一个很好的开始。它们有特定于类的方法来提取关于自身的信息,让我们说一个名字,但不要用同样的方式。@MarcusBooster我是说,在这个意义上的关系,它们的任何共同超类,或共同超接口?@MarcusBooster唉!您现在唯一的选择是
instanceof
检查并随后进行适当的强制转换。最好创建两个不同的方法,分别传递它们
List
List
。从哪里获得
。instanceOf
?它将如何使用
开关
()
似乎表明
instanceOf
(大写
O
)是一种方法。您提供的链接引用了一个关键字(顺便说一句,在交换机中不能使用该关键字)。在您提供完整的示例之前,请先对您的答案进行否决。Java有一个允许继承和重写方法的类型系统,鉴于前者,这对于OP尝试执行的操作来说是一个糟糕的解决方案。@Ben如果这是必须在同一循环中使用类的唯一情况,那么这是一个合理的解决方案。如果在代码的其他部分需要进行这样的比较,那么一个接口是有意义的,我上面的答案是相同的,从哪里可以得到
。instanceOf
?它将如何使用
开关
()
似乎表明
instanceOf
(大写
O
)是一种方法。您提供的链接引用了一个关键字(顺便说一句,在交换机中不能使用该关键字)。在您提供完整的示例之前,请先对您的答案进行否决。Java有一个允许继承和重写方法的类型系统,鉴于前者,这对于OP尝试执行的操作来说是一个糟糕的解决方案。@Ben如果这是必须在同一循环中使用类的唯一情况,那么这是一个合理的解决方案。如果在代码的其他部分需要进行这样的比较,那么接口是有意义的,我上面的答案是相同的。您的答案包含OP试图完成的事情的轶事,但没有回答他们的问题,如果您只是指定他们可以使用
instanceof
来确定类的类型,并且这是一种不好的做法,那么您的答案将是完整的。您的答案包含OP试图完成的事情的轶事,但没有回答他们的问题,如果您只是指定他们可以使用
instanceof
来确定类的类型,并且这是一种不好的做法,那么您的答案将是完整的。