2

这是我的整体工作流程。首先创建一个接口:

public interface foo {
   void bar(Baz b);
}

然后,例如,制作一个具有不同对象的向量,这些对象都实现了所述接口:

myVector.add(new Ex);  //both Ex and Why implement foo.
myVector.add(new Why); 

最后,使用界面:

for(int i=0; i<myVector.size(); i++) {
    myVector.get(i).bar(b);
}

但是,由于显而易见的原因,这会产生编译时错误:

方法 bar() 未为 Object 类型定义

投射不起作用,因为 Ex 和 Why 不相关。Try-catch 转换为 Ex 然后Why 是一个可怕的变通方法。让 Ex 和Why都扩展 Bar_doers 听起来也不简洁,因为那将取消接口。

如何执行关心对象是否实现给定接口而不是对象是否属于给定类的操作?

4

3 回答 3

11

您需要阅读有关泛型的信息。

假设您使用的是标准 Java 容器,那么您的解决方案是这样定义myVector

List<foo> myVector = new ArrayList<foo>();
于 2013-01-13T21:46:41.130 回答
2

将它们投射到您的界面,它将起作用:

for(int i=0; i<myVector.size(); i++) {
    ((foo)myVector.get(i)).foo(b);
}
于 2013-01-13T21:46:34.850 回答
1
public interface A {
    public void myMethod();
}




public class B implements A {

    @Override
    public void myMethod() {
        System.out.println("B");
    }

}


import java.util.ArrayList;
import java.util.List;



public class C implements A {

    @Override
    public void myMethod() {
        System.out.println("C");
    }

    public static void main(String[] args){
        List<A> list = new ArrayList<>();
        list.add(new B());
        list.add(new C());

        for(A obj : list){
            obj.myMethod();
        }
    }

}

上面将打印:

B
C
于 2013-01-13T21:55:19.033 回答