我不知道如何描述我的问题所以我会举个例子:
public abstract class A {
public abstract void methodToOverride();
public void methodNotToOverride() { }
}
public class B extends A {
@Override
public void methodToOverride() { }
public void someOtherMethodNotFromClassA() { }
}
现在我需要在我的代码中做这样的事情:
A object = new B();
object.someOtherMethodNotFromClassA();
但我得到“无法解决方法错误”。在抽象类中定义此类方法不是一种选择。任何线索?
答案 0 :(得分:3)
这是不可能的。虽然对象是B类,但引用的类型为A.因此,您只能访问A类可见的方法。
如果你改变了这个:
A a = new B();
到此:
B a = new B();
您将能够访问someOtherMethodNotFromClassA
。另一种选择是将a
投射到B
类型:
A a = new B();
((B)a).someOtherMethodNotFromClassA();
答案 1 :(得分:2)
尽管存在一些其他语法错误,但Oliver Weiler是正确的,Reference是A类型,因此您只能访问A类型的方法。
如果你把它转换为B类,那么你也可以访问B类方法。为了安全起见,检查一下,如果类型确实是B instanceof
A clazz = new B();
if (clazz instanceof B)
((B)clazz).someOtherMethodNotFromClassA();
我相信您的真实代码有点复杂,因此您可能会考虑投射......
顺便说一下:一个变量名'class'不会工作,使用一些不同的东西。
答案 2 :(得分:1)
如果确实需要使用类B
中的方法,而确实需要使用抽象超类A
来指定你可以使用:
A clazz = new B();
((B)clazz).someOtherMethodNotFromClassA();
请注意,这不是一个很好的做法。
答案 3 :(得分:1)
您的代码中有两个问题。
首先,您需要实际为任何抽象方法提供实现,以使您的类可以实例化。所以在你的情况下:
@Override
public void methodToOverride(){
// does nothing
}
其次,更重要的是,当您将对象实例化为类型A
时,只能访问与A
相关的方法。由于您将new B()
定义为A
类型,因此您无权访问方法someOtherMethodNotFromClassA
。
如果要访问它,则需要将其实例化为B类,或者将其转换为B类:
B someClass = new B();
someClass.someOtherMethodNotFromClassA();
或
A someClass = new B();
((B)someClass).someOtherMethodNotFromClassA();
但请记住,后一种选择非常难看并且不易维护。
答案 4 :(得分:0)
我自己刚刚遇到这个问题,这太可怕了!如果不能将子类用作参数,那么如何创建可重用代码?例如在图书馆:
base R
然后在申请中:
public abstract class AbstractSetting {
private boolean property = false;
public void getProperty() { return property; }
}
public abstract class AbstractFoo {
protected AbstractSetting setting;
protected void setSetting(AbstractSetting setting) {
this.setting = setting;
}
public boolean foo() {
setting.getProperty();
}
}
如何解决这个问题?