在下面的代码中,我将 "testmethod() 传递给方法 "testmethod() 一个名为 B 的子类的实例化
不幸的是,该方法的签名接受超类 A 而不是子类 B而且我无法更改该签名,因为它被许多类引用。
有没有办法(在不更改 testmethod() 的签名的情况下)我可以从 testmethod() 中访问 var2 变量,该变量是传递给 testmethod 的对象的一部分?
public class test5 {
public static void main(String args[]){
B b = new B();
testmethod(b);
}
public static void testmethod(A a2 ) {
System.out.println("in testmeth->" + a2.getVar1() ); // WORKS
System.out.println("in testmeth->" + a2.getVar2() ); // DOESNT WORK
}
}
class A {
int var1 = 2;
public int getVar1() {
return var1;
}
}
class B extends A {
int var2 = 8;
public int getVar2() {
return var2;
}
你可以像这样投射:
if(a2 instanceof B)
System.out.println("in testmeth->" + ((B) a2).getVar2() );
else
System.out.println("in testmeth->" + a2.getVar1() );
你可以低调,但这通常不是一个好的做法。
所以它会是
System.out.println("in testmeth->" + ((B) a2).getVar2() );
注意:如果a2
不是类B
instanceof
,则此行将导致ClassCastException
您可以重载该方法,然后在调用时选择最具体的方法。 即:
public class test5 {
public static void main(String args[]){
A a = new A();
B b = new B();
testmethod(a);
testmethod(b);
}
public static void testmethod(A a2 ) {
System.out.println("in testmeth_a->" + a2.getVar1() );
}
public static void testmethod(B b2 ) {
System.out.println("in testmeth_b->" + b2.getVar2() );
}
}
铌。调用的方法取决于声明的类型,而不是传入对象的类型。看这里。
从最小的示例中很难分辨出来,但看起来您可能希望将A
变成一个抽象类,这需要B
(和任何其他子类)来实现getVar2()
。执行此操作时,可以通过任何A
实例访问getVar2
:
abstract class A {
int var1 = 2;
public int getVar1() {
return var1;
}
public abstract int getVar2();
}