2013-07-13 51 views
0

我是新来的java,并且在尝试一些what is the output问题时发现了这个问题。为什么这个接口实例在引用实现该接口的类实例时会出错

这条线InterfaceB obj = new ClassA();给出错误,而其他不是。

我知道一个超类变量可以引用一个子类变量,它和接口相同。 但是在这种情况下会发生什么。我想知道看到的背后发生了什么。

interface InterfaceA { void methodA(); } 

interface InterfaceB extends InterfaceA { void methodB(); } 

class ClassA implements InterfaceA 
{ 
    public void methodA() {} 
    public void methodB() {} 
} 

class ClassB extends ClassA implements InterfaceB 
{ 
    public ClassB() {} 
    // InterfaceA obj = new ClassA(); no error 
    InterfaceB obj = new ClassA(); //give error: incompatible types 
    // InterfaceA obj = new ClassB(); no error 
    // InterfaceB obj = new ClassB(); no error 
     // ClassA obj = new ClassB(); no error 
} 

public class Online4 { 
    public static void main(String args[]) { 
     ClassB b = new ClassB(); 
    } 
} 

回答

3

因为ClassA的未实现接口B.

永远记住,在Java中的父类型可以引用子类型你得到这个错误。

类型IntefaceB与类型ClassA无关。以及下述工作

InterfaceB obj = new ClassA(); 

ClassA的需要具有它的父类是InterfaceB(直接或通过任何其它类型的,它实现InterfaceB(类)或延伸InterfaceB(接口)。

+0

我错过了InterfaceA是Hierarchy中的父级,InteraceB和ClassA就像兄弟姐妹一样。 – netsmertia

1

接口的引用可以保持参照对象,implenting该接口在你的情况你CLASSA没有实现interfac乙因此你在得到的错误:。

InterfaceB obj = new ClassA(); 

在所有其他评论的情况下在你的代码接口的参考使用的是实际的持有实现该接口的类(子/父)的对象。

1

一个接口包含一个类实现的行为。

在你的情况ClassA没有实现接口B.

InterfaceB obj = new ClassA(); //give error: incompatible types 

,使该行的工作,你可以用interfaceB

interface InterfaceA extends InterfaceB 

现在

InterfaceB obj = new ClassA(); //compiles 
延长你了InterfaceA

你正在做相反的事情。其中InterfaceBInterfaceA的父项。

1

为了表述清楚地继承链:

1)InterfaceB是接口A的子

2)A类是接口A

3)B类的一个孩子的孩子接口B和类A(以及接口A)

父变量(接口或类)类型可以包含子类(类)实例。 除此之外的任何内容都会引发错误。