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

时间:2019-01-27 06:01:48

标签: java class interface

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

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正确时有哪些可能性?

谢谢

3 个答案:

答案 0 :(得分:1)

A类将仅具有接口I的实现
变量具有两种类型:声明(或静态)类型和运行时类型。

I3 ob = new A();

因此,此ob变量被声明为类型I3,其引用的对象的类型为A。这将为您提供编译时异常。并要求您强制转换为I3。 但是仍然会得到运行时异常'java.lang.ClassCastException'。

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

如果有,

 class A implements I3{}

然后A将具有II2I3的所有实现。然后,
I3 ob = new A();
是可能的。

A实现I3时的可能性:

您可以使用ob来调用接口II2I3的方法。您可以检查是否返回了类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 { ... }