我有一个ClassA数组,它不实现任何接口。但是有一个ClassBClassC,它们都实现了接口InterfaceAInterfaceA看起来像这样:

public interface InterfaceA {
    int methodA();
}


现在,我要遍历ClassA的实例数组(其中还包含ClassBClassC的一些实例),并且想获取methodA()的每个结果的和。

在运行时,以下代码应该起作用(imO):

myArray = new ObjectA[10];

// how the Array gets it's content is irrelevant here

int result = 0;
for (final ObjectA a : myArray) {
    if (a instanceof InterfaceA) {
        result += a.methodA();
    }
}


但是由于ClassA不一定有methodA(),因此我的编译器对此感到不满意。它认为未定义a.methodA(),因为编译器不知道if条件。因此,如果您没有对methodA()实现抽象的ClassA,该怎么办?

最佳答案

您应该使用强制转换使编译器满意。在您的代码中,在a上调用methodA,它可以是ClassA或ClassB或其他任何实例。
由于您已经在限制非interfaceA实例进入IF块,因此可以使用强制类型转换。

for (final ObjectA a : myArray) {
    if (a instanceof InterfaceA) {
        result += ((InterfaceA)a).methodA();
    }
}

10-06 11:05