【问题标题】:Child Interface pointing Parent Interface implementing class子接口指向父接口实现类
【发布时间】:2019-01-27 06:01:48
【问题描述】:

我正在检查一个具有以下完全相同逻辑的代码,但无法理解它是如何发生的。所以请多多包涵..! :)

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

谢谢

【问题讨论】:

  • Java 关键字是classinterface。不是ClassInterface
  • 您不能在 Java 中以数字开头的标识符(接口名、类名等)。所以interface 1 {} 不会编译。
  • @PrasadKarunagoda,感谢您的编辑。对我的问题有任何想法吗?
  • A 不是 I3 对象,所以 I3 ob = new A(); 是一个错误
  • @c0der,是的,理想情况下它应该是错误的。但它不是。还有其他可能的地方吗?

标签: java class interface


【解决方案1】:

在下面的代码 cmets 中查看我的详细说明。

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
  }                  
}

【讨论】:

  • 所以我认为您的回答暗示“当第 1 步正确时有哪些可能性”的问题是没有的。
  • @但是如果A实现了I3,那么I ob3 = new A();将工作 ..!它认为它就像父子关系。孩子不能吞下父母,但父母可以做到..! :)
  • "如果 A 实现了 I3,那么 I ob3 = new A(); 会起作用" 向我们展示它的一个案例。
  • @c0der,它会编译..我确定..! :)
  • @c0der,但我仍然无法得到我的答案..! :(
【解决方案2】:

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的方法。您可以检查是否返回 Class A 中的实现。

【讨论】:

  • Class A will have all the implementations of Interface 1, 2 and 3 我在发布的代码中看不到这一点。 A 仅实现 I(或 1)
  • Andrea,发布了一个代码,其中接口名为 1、2 和 3。现在他更改了代码。我的答案是他之前发布的代码。 @Andrea 如果您想更改问题,请创建一个新线程。
  • 问题没有改变。只有名称更改为有效的 java 名称。
  • 不仅仅是名称,在 A 类实现 I3 之前。现在您已将其更改为实现 I
  • A 类正在实施 1。
【解决方案3】:

我认为它在 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 { ... }

【讨论】:

  • C c = new A(); 无法编译
  • A a = new C(); 是正确的,因为C 也是A(而A 不一定是C),但我看不出它是如何回答问题的。
猜你喜欢
  • 2017-10-21
  • 2018-06-29
  • 2016-09-30
  • 2015-05-12
  • 2016-06-20
  • 2017-05-15
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多