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