Java 指向父接口实现类的子接口

Java 指向父接口实现类的子接口,java,class,interface,Java,Class,Interface,我正在用下面完全相同的逻辑检查一个代码,但无法理解它是如何发生的。所以请容忍我……:) 这在步骤1中是不可能的,但我正在检查一个代码,其中这种逻辑是在没有任何错误的情况下发生的。我可以知道,如果这是发生没有错误比什么其他可以被视为检查其发生的权利?当第一步正确时,有什么可能性 谢谢A类将只有接口I的实现 变量有两种类型:声明(或静态)类型和运行时类型 i3ob=newa() 因此,这个ob变量被声明为类型I3,它引用的对象是类型A。这将给您带来编译时异常。并要求您转换到I3。 但仍然会得到运行时

我正在用下面完全相同的逻辑检查一个代码,但无法理解它是如何发生的。所以请容忍我……:)

这在步骤1中是不可能的,但我正在检查一个代码,其中这种逻辑是在没有任何错误的情况下发生的。我可以知道,如果这是发生没有错误比什么其他可以被视为检查其发生的权利?当第一步正确时,有什么可能性


谢谢

A类将只有接口
I的实现

变量有两种类型:声明(或静态)类型和运行时类型

i3ob=newa()

因此,这个
ob
变量被声明为类型
I3
,它引用的对象是类型A。这将给您带来编译时异常。并要求您转换到
I3
。 但仍然会得到运行时异常“java.lang.ClassCastException”。

您只能将引用分配给其超级类型的变量。接口
I
是类
A
的超级类型。接口
I3
不是A类的超级类型

如果你有

 class A implements I3{}
然后它
A
将拥有
I
I2
I3
的所有实现。然后,
i3ob=newa()
本来是可能的

A
实现
I3
时的可能性:


您可以使用
ob
调用接口
I
I2
I3
的方法。您可以检查类
A
中的实现是否返回。

类A将只包含接口
I

变量有两种类型:声明(或静态)类型和运行时类型

i3ob=newa()

因此,这个
ob
变量被声明为类型
I3
,它引用的对象是类型A。这将给您带来编译时异常。并要求您转换到
I3
。 但仍然会得到运行时异常“java.lang.ClassCastException”。

您只能将引用分配给其超级类型的变量。接口
I
是类
A
的超级类型。接口
I3
不是A类的超级类型

如果你有

 class A implements I3{}
然后它
A
将拥有
I
I2
I3
的所有实现。然后,
i3ob=newa()
本来是可能的

A
实现
I3
时的可能性:


您可以使用
ob
调用接口
I
I2
I3
的方法。您可以检查类
A
中的实现是否已返回。

我认为它是在java中向上转换的。例如,当您将类C定义为B的扩展,将B定义为A的扩展时,您可以使用容器A作为C对象的保持器:

class A
class B extends A
class C extends B
然后您可以定义一个C对象,如下所示:

A a = new C();
java中的一个很好的例子是定义ArrayList:

List<E> list = new ArrayList<>();

我想这是java的升级版。例如,当您将类C定义为B的扩展,将B定义为A的扩展时,您可以使用容器A作为C对象的保持器:

class A
class B extends A
class C extends B
然后您可以定义一个C对象,如下所示:

A a = new C();
java中的一个很好的例子是定义ArrayList:

List<E> list = new ArrayList<>();

请参阅下面代码注释中的详细说明

class A implements I{}

class B extends A{}

class C extends B{}

interface I{}

interface I2 extends I{}

interface I3 extends I2{}

class Top {

  public static void main(String[] args){

    I ob1 = new A(); // Compiles bcoz A "is an" I
    I2 ob2 = new A(); // Does not compile bcoz A "is not an" I2
    I3 ob3 = new A(); // Does not compile bcoz A "is not an" I3
  }                  
}

请参阅下面代码注释中的详细说明

class A implements I{}

class B extends A{}

class C extends B{}

interface I{}

interface I2 extends I{}

interface I3 extends I2{}

class Top {

  public static void main(String[] args){

    I ob1 = new A(); // Compiles bcoz A "is an" I
    I2 ob2 = new A(); // Does not compile bcoz A "is not an" I2
    I3 ob3 = new A(); // Does not compile bcoz A "is not an" I3
  }                  
}


Java关键字是
class
interface
。不是
Class
Interface
。不能用Java中的数字启动标识符(接口名、类名等)。因此,
接口1{}
无法编译。@PrasadKarunagoda,谢谢您的编辑。对我的问题有什么想法吗?
A
不是
I3
对象,所以
i3ob=newa()是一个error@c0der,是的,理想情况下应该是错误的。但事实并非如此。还有其他的可能性吗?Java关键字是
class
interface
。不是
Class
Interface
。不能用Java中的数字启动标识符(接口名、类名等)。因此,
接口1{}
无法编译。@PrasadKarunagoda,谢谢您的编辑。对我的问题有什么想法吗?
A
不是
I3
对象,所以
i3ob=newa()是一个error@c0der,是的,理想情况下应该是错误的。但事实并非如此。还有其他的可能性吗?
A类将拥有接口1、2和3的所有实现
我在发布的代码中看不到这一点
A
仅实现
I
(或1)Andrea发布了一个名为1、2和3的接口的代码。现在他改变了密码。我的答案是他早些时候发布的代码@Andrea如果要更改问题,请创建一个新线程。问题未更改。在类A实现I3之前,只有名称更改为有效的java名称,而不仅仅是名称。现在您已将其更改为实现IClass A正在实现1。
类A将具有接口1、2和3的所有实现
我在发布的代码中看不到这一点
A
仅实现
I
(或1)Andrea发布了一个名为1、2和3的接口的代码。现在他改变了密码。我的答案是他早些时候发布的代码@Andrea如果要更改问题,请创建一个新线程。问题未更改。在类A实现I3之前,只有名称更改为有效的java名称,而不仅仅是名称。现在您已经将其更改为实现IClass A正在实现1不编译
A=newc()
是正确的,因为
C
也是
A
(而
A
不一定是
C
),但我看不出它是如何回答这个问题的不编译
A=newc()<