获取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
来确定类的类型,并且这是一种不好的做法,那么您的答案将是完整的。