我有一个外部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
答案 0 :(得分:7)
您在子类中添加了一个新类,该方法在超类中不存在。无法使用对超类的引用来调用子类中的新方法。您必须转换为子类类型才能使用新方法。
您可以执行以下操作:
A obj = new B();
if (obj instance of B) {
B b = (B)obj;
int n = b.pingB(3);
}
此处B
是A
但A
不是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;) - >这样,类型绑定不适用于编译。