我正在使用完全相同的逻辑检查一个代码,但无法理解它是如何发生的。所以请忍受我..! :)
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){
I3 ob = new A(); //Step I
}
}
在步骤1中是不可能的,但是我正在审阅发生这种逻辑而没有任何错误的代码。请问这是否发生是没有错误的,否则可以检查一下是否发生了什么?步骤1正确时有哪些可能性?
谢谢
答案 0 :(得分:1)
A类将仅具有接口I
的实现
变量具有两种类型:声明(或静态)类型和运行时类型。
I3 ob = new A();
因此,此ob
变量被声明为类型I3
,其引用的对象的类型为A。这将为您提供编译时异常。并要求您强制转换为I3
。
但是仍然会得到运行时异常'java.lang.ClassCastException'。
您只能将引用分配给其超级类型的变量。接口I
是类A
的超类型。接口I3
不是A类的超类型。
如果有,
class A implements I3{}
然后A
将具有I
,I2
和I3
的所有实现。然后,
I3 ob = new A();
是可能的。
类A
实现I3
时的可能性:
您可以使用ob
来调用接口I
,I2
和I3
的方法。您可以检查是否返回了类A
中的实现。
答案 1 :(得分:1)
在下面的代码注释中查看我的阐述。
<div class="answerOpts">
<input class="optionRadios" type="radio" name="2565" id="answer_9218" value="9218">
<label class="options searchable" for="answer_9218">
<div>
<p>2.x</p>
</div>
</label>
<input class="optionRadios" type="radio" name="2565" id="answer_9219" value="9219">
<label class="options searchable" for="answer_9219">
<div>
<p>3.x</p>
</div>
</label>
<input class="optionRadios" type="radio" name="2565" id="answer_9220" value="9220">
<label class="options searchable" for="answer_9220">
<div>
<p>4.x</p>
</div>
</label>
<input class="optionRadios" type="radio" name="2565" id="answer_9217" value="9217">
<label class="options searchable" for="answer_9217">
<div>
<p>1.x</p>
</div>
</label>
</div>
答案 2 :(得分:0)
我认为它在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<>();
您知道ArrayList的定义是:
class ArrayList implements List { ... }