1

我有一个带有类“A”和本地类“B”的外部 API(我不能修改它),它覆盖了“A”的方法并添加了一个附加功能。我需要根据某个参数“is_A”使用其中之一。

/ ------ API (A.java) ----- /

package A;

public class A {

    public int pingA( int value ) {

        return value;

    }

}

/ ------ 我的班级(B.java) ----- /

package B;

import A.*;

public class B extends A {

    @Override
    public int pingA( int value ) {
        return value;
    }

    public int pingB( int value ) {
        return value;
    }

    public static void main(String[] args) {
        final boolean is_A = false;
        A obj;
        if (is_A) {
            obj = new A();
        } else {
            obj = new B();
        }
        if (!is_A) {
            int n = obj.pingB(3);
        }
    }
}

在这种情况下,我想使用类“B”,但命令“int n = obj.pingB(3);” 未编译,因为 A 中没有方法 pingB。确切的消息是:

cannot find symbol
symbol: method pingB(int)
location: class A.A
4

4 回答 4

7

您要在超类中不存在的子类中添加新方法。无法使用对超类的引用来调用子类中的新方法。您必须转换为子类类型才能使用新方法。

您可以执行以下操作:

A obj = new B();

if (obj instance of B) {
   B b = (B)obj;
   int n = b.pingB(3);
}

B是 aAA不是 aB所以它没有 pingB(int) 方法。

于 2010-01-08T00:26:38.443 回答
2

您需要转换 objB.

if (!is_A) {
    int n = ((B) obj).pingB(3);
}

顺便说一句,您可以更好地使用instanceof关键字而不是is_A.

if (obj instanceof B) {
    int n = ((B) obj).pingB(3);
}
于 2010-01-08T00:29:17.050 回答
1

您需要转换为派生类才能调用它的方法。通常这已经完成了,if( obj instanceof B )但是由于你已经有了一个包含该信息的布尔值,它看起来像这样:

public static void main(String[] args) { 
    final boolean is_A = false; 
    A obj; 
    if (is_A) { 
        obj = new A(); 
    } else { 
        obj = new B(); 
    } 
    if (!is_A) { 
        int n = ((B) obj).pingB(3); 
    } 
}
于 2010-01-08T00:33:05.740 回答
0

obj 仍然具有类型 A (-> 您声明了 A obj;) -> 这样类型绑定不适用于编译。

于 2010-01-08T00:29:23.163 回答