Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java实现的接口方法无法从子类访问_Java_Inheritance - Fatal编程技术网

Java实现的接口方法无法从子类访问

Java实现的接口方法无法从子类访问,java,inheritance,Java,Inheritance,问题描述: 当试图在实现接口的子类中运行方法时,编译将出错并返回错误 Main.java:5: error: cannot find symbol 无论包位置、代码位置(即:一个文件中的所有代码与拆分为单独的*.java文件)或实现的方法如何,都会发生这种情况 问题示例: 我有两个类和一个接口,A、B和myInterface。类A是抽象的,而B继承自A并实现myInterface。问题是,当我运行代码时,我无法从我实现的接口调用任何方法 接口myInterface{ 公共物品(某物); } 抽

问题描述:

当试图在实现接口的子类中运行方法时,编译将出错并返回错误

Main.java:5: error: cannot find symbol
无论包位置、代码位置(即:一个文件中的所有代码与拆分为单独的*.java文件)或实现的方法如何,都会发生这种情况

问题示例:

我有两个类和一个接口,A、B和myInterface。类A是抽象的,而B继承自A并实现myInterface。问题是,当我运行代码时,我无法从我实现的接口调用任何方法

接口myInterface{
公共物品(某物);
}
抽象A类{
国际货币基金组织;
(){
这是0.aVal=0;
}
公共int getVal(){
返回aVal;
}
}
类B扩展了实现myInterface的{
B(){
超级();
}
}
公共空间{
System.out.println(“某物”);
}
班长{
公共静态void main(字符串[]args){
A bObj=新的B();
打印某物();
//投掷
//Main.java:5:错误:找不到符号
//打印某物();
//           ^
//符号:方法printSomething()
//位置:A型变量bObj
//1错误
}
}
为了便于运行和查看,我在这里保存了与上面相同的代码


为什么会发生这种情况,我将如何着手解决这个问题?我和我的老师一直在试图弄清楚这个问题。

我相信问题在于你把所有东西都放在了一个类a引用中,它没有实现myInterface,因此不一定要调用printSomething方法

您有一个
A
类型的对象。您试图调用
printSomething
,但是
A
的类型不一定有这个方法。只有实现myInterface的东西才有这种方法。因此,您需要指定
A
具有该方法


或者创建一个泛型方法,该方法仅适用于实现该接口的类型

由于类A中没有printSomething()方法,并且您使用类A的引用来保存子对象B,因此根据继承原则,您无法使用父引用访问特定于子对象的方法。

让我尝试以规范的方式回答这个问题

以下是您的界面:

interface iA {
    void fromA();
}
interface iB {
    void fromB();
}
和类层次结构

class cX implements iA {
    public void fromX() {}
    public void fromA() {} // to implement iA
}
class cY extends cX implements iB {
    public void fromY() {}
    public void fromB() {} // to implement iB
}
请注意,
cY
还隐式地实现了iA——它是从
cX
继承下来的

现在让我们看看什么是有效的

cY cy = new cY();
cy.fromA();  // valid - cY extends cX implements iA
cy.fromB();  // valid - cY implements iB
cy.fromX();  // valid - cY extends cX
cy.fromY();  // valid - cy is a cY

cX cx = new cY(); // valid - cY extends cX
cx.fromA();  // valid - cx implements iA
cx.fromB();  // INVALID - cX does not implement iB. The compiler doesn't know cx is actually a cY instance.
cx.fromX();  // valid - cY extends cX
cx.fromY();  // INVALID - cX is not a cY

iA ia = new cY(); // valid cY extends cX implements iA
ia.fromA();  // valid - fromA() is an iA method
ia.fromB();  // INVALID - iA is not a cY
ia.fromX();  // INVALID - iA does not have that method. Again, compiler doesn't know ia is a cY instance.
因为您在评论中询问了“多态性”:这是多态性部分:

iA v = new cY();  // can assign a cY instance to an iA variable
v = new cX();     // can assign a cX instance to an iA variable

这也是您现在无法调用
v.fromX()
v.fromY()
的原因
v
也可以赋值,因此只有公分母可用-即
iA
方法。

您需要将
myObj
声明为
B
myInterface
A
没有该方法。@daniu这是否意味着在使用接口时不可能以多态方式编码?我知道这样编程是可能的,程序会找到正确的方法。例如,@user85421看起来这可能是一个老师相信并展示事物能够以一种方式工作的例子,而事实上它们不能。他认为,它应该仍然能够找到子类的类/接口方法。经过进一步测试,它似乎不是这样工作的。@user85421好吧,我将把它改为B bObj=new B();从现在起,坚持这一标准。我觉得和bObj在一起有点奇怪但是。。。学生必须先跟着老师。谢谢谢谢,这是关于我认为它是如何工作的,但我收到的指示恰恰相反。听起来,即使您可以使用多态性做一些事情,但如果您真的需要子类中定义的其他方法,可能也没有太多理由这么做。。。这是有道理的。