为什么此接口实例在引用实现该接口的类实例时会出错

时间:2013-07-13 09:50:53

标签: java interface

我是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();
    }
}

4 个答案:

答案 0 :(得分:3)

您收到此错误,因为ClassA未实现接口B.

永远记住java中的父类型可以引用Subtype。

类型IntefaceB与此类型的类型无关。并为以下工作

InterfaceB obj = new ClassA(); 

ClassA需要将其父类型设置为InterfaceB(直接或通过实现InterfaceB(类)的任何其他类型或扩展InterfaceB(接口)。

答案 1 :(得分:1)

接口引用可以保存对象的引用,实现该接口。在您的情况下,您的classA没有实现interfac B,因此您收到错误:

InterfaceB obj = new ClassA(); 

在您的代码中的所有其他注释案例中。所使用的接口的引用实际上是一个类(子/父)的对象,它实现了该接口。

答案 2 :(得分:1)

接口包含类实现的行为。

在您的情况下,ClassA未实现接口B.

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

要使该行有效,您可以使用 interfaceB

扩展您的界面A.
interface InterfaceA  extends InterfaceB 

现在

   InterfaceB obj = new ClassA(); //compiles
你正在反向做。其中InterfaceBInterfaceA的父级。

答案 3 :(得分:1)

明确说明继承链:

1)InterfaceB是Interface A的孩子

2)A类是接口A的孩子

3)B类是接口B和A类(因此接口A)的子代

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