java类,扩展了外部API功能

时间:2010-01-08 00:24:13

标签: java methods extends

我有一个外部API(我不能修改它),类“A”和本地类“B”覆盖了“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 个答案:

答案 0 :(得分:7)

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

您可以执行以下操作:

A obj = new B();

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

此处BAA不是B,因此它没有pingB(int)方法。

答案 1 :(得分:2)

您需要cast obj返回B

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

您可以更好地使用instanceof关键字代替is_A

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

答案 2 :(得分: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); 
    } 
}

答案 3 :(得分:0)

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