在下面的代码中,我将方法“testmethod()传递给A的子类的实例化,名为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;
}
答案 0 :(得分:3)
你可以向下倾斜,但这通常不是一个好习惯。
所以它会是
System.out.println("in testmeth->" + ((B) a2).getVar2() );
注意:如果a2
不是instanceof
班级B
,则此行会产生ClassCastException
答案 1 :(得分:2)
你可以像这样投射:
if(a2 instanceof B)
System.out.println("in testmeth->" + ((B) a2).getVar2() );
else
System.out.println("in testmeth->" + a2.getVar1() );
答案 2 :(得分:2)
您可以重载该方法,然后在调用时选择最具体的方法。即:
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() );
}
}
NB。调用的方法取决于声明的类型,而不是传入的对象的类型。请参阅here。
答案 3 :(得分:0)
很难从最小的例子中看出来,但看起来你可能想让A
成为一个抽象类,需要B
(以及任何其他子类)来实现getVar2()
。执行此操作时,getVar2
可通过A
的任何实例访问:
abstract class A {
int var1 = 2;
public int getVar1() {
return var1;
}
public abstract int getVar2();
}