Java 当无法实例化接口时,如何将类实例强制转换到接口?
更具体地说,下面代码中的Java 当无法实例化接口时,如何将类实例强制转换到接口?,java,Java,更具体地说,下面代码中的a类型是什么 interface A {} class B implements A { A a; B b = new B(); a = (A) b; } 不能实例化A并不意味着不能使用A引用调用A派生对象 你不能真的创造一个可以行走的东西——你可以创造一个可以行走的人,但是可以单独行走的东西不够详细,不能从中创造一个东西。 但你肯定只能把能走路的东西放在房间里 A不够详细,无法从中创建对象,它是抽象的,但您可以通过引用A捕获实现它的对象 因此
a
类型是什么
interface A {}
class B implements A {
A a;
B b = new B();
a = (A) b;
}
不能实例化
A
并不意味着不能使用A
引用调用A
派生对象
你不能真的创造一个可以行走的东西——你可以创造一个可以行走的人,但是可以单独行走的东西不够详细,不能从中创造一个东西。
但你肯定只能把能走路的东西放在房间里
A不够详细,无法从中创建对象,它是抽象的,但您可以通过引用A
捕获实现它的对象 因此,a的类型是对接口的引用,该接口指向(或引用)B类的对象
A a;
只是一个变量声明。它只是说“为一个(至少)类型为a
的对象声明一个名称a
。a
的值未定义
我们只声明我们需要一个变量a
,我们只希望这个变量只引用(至少)类型a
的对象
我不知道它们是谁,但是,是的,接口不能被实例化。把它们想象成没有实现(最多Java 7)的抽象类。你如何调用一个没有实际代码的方法?你不能,因此你不能在Java中创建这样一个不完整类型的实例
声明变量a
或多或少意味着a
引用的每个对象必须至少实现a
。就是这样。因为不能直接实例化a
,所以必须创建一个实现a
的类
现在,由于每个B
都是A
(通过实现A
),因此A
可以引用B
的对象(因为每个B
也是A
)。提供仅由A
指定但未由A
实现的方法的实现是B
的工作。在此符号中,B
完成A
,A
提供了B
至少必须提供的方法的规范
请注意,对于Java 8,这是一种简化。由于Java 8中的接口可以提供默认方法,因此接口实现更像是多重继承。声明的
a
的时间类型是a
。您存储的对象类型是B
,因此a
引用的对象的运行时类型是B
。不需要强制转换,因为每个B
都是A
。你的困惑在哪里?他们说我们不能实例化接口。我的问题是我们应该怎么称呼这个操作:A A;A
?你只需要声明一个变量,其他什么都没有。你知道为什么不能实例化接口吗?那么A是A类型A的变量?“为什么我们不能实例化一个接口?”如果你做一些研究,你可以自己回答:)。