Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当无法实例化接口时,如何将类实例强制转换到接口?_Java - Fatal编程技术网

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的变量?“为什么我们不能实例化一个接口?”如果你做一些研究,你可以自己回答:)。