栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么类不能扩展其中发生的静态嵌套类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么类不能扩展其中发生的静态嵌套类?

这似乎是一个非常有害的极端情况,因为存在许多与循环继承相关的错误,这些错误通常导致编译器中出现无限循环,堆栈溢出和OOM。以下是一些可能提供一些见解的相关报价:

错误4326631:

这个例子是
合法的,在即将出版的第二版Java语言规范中对此做了明确说明。通过继承和封闭性同时关联的类是有问题的,但是原始的内部类白皮书并未充分解决该问题,1.3之前的编译器也未实施一致的策略。在JLS
2nd
Edition中,扩展了禁止循环继承的规则,以禁止类或接口直接或间接“依赖”自身。一个类型不仅取决于它扩展或实现的类型,还取决于那些类型名称中充当限定符的类型。

错误6695838:

这两个类的声明确实是循环的。根据JLS 8.1.4,我们有:

Foo取决于Foo $ Intf(Foo $ Intf出现在Foo的Implements子句中)
Foo $ Intf取决于Moo $ Intf(Moo $ Intf出现在Foo $ Intf的extends子句中)
Foo $ Intf取决于Foo(Foo出现为Foo $ Intf的extends子句中的限定符)

对于传递性,我们认为Foo依赖于自身。因此,应使用编译时错误拒绝该代码。

错误8041994:

退后一步,在JLS2中引入了类和接口的直接依赖关系,以阐明JLS1并涵盖嵌套类的超类/超接口(例如,描述中的AB)。

错误6660289:

此问题归因于javac执行wrt类归因的类型变量范围归因的顺序。

1)类Outer
1a)属性Outer的属性触发了属性类型变量的
属性2)属性Outer.T的
属性2a)属性Outer.T的属性触发了声明的绑定的
属性3)属性类别Outer的属性触发了.Inner
3a)Outer的归属.Inner触发Outer.Inner的类型变量的
归属4)Outer.Inner
归属4a)Outer.Inner.S的归属触发其声明的绑定的归属
5)归属of Outer.T-除了返回T的类型外什么也不做;如您所见,在此阶段,尚未在表示T类型的对象上设置T的界限。

稍后,对于每个属性类型变量,javac都会执行检查以确保给定类型变量的边界不会引入循环继承。但是我们已经看到,Outer.T没有设置任何限制。因此,这是javac在尝试检测由Outer.Inner.S的已声明边界引起的继承树中的循环时因NPE崩溃的原因。

错误6663588:

类型变量界限可能是指属于循环继承树的类,当查询符号时,此类会导致解析过程进入循环。

对于您的“ 问题依赖性是什么?
”这个特定问题,这似乎是一个复杂的编译时符号解析边缘情况,并且JLS2中引入的解决方案是简单地禁止限定符类型以及实际超类型引入的循环。

换句话说,从理论上讲,可以对编译器进行适当的改进,但是直到有人出现并实现这种情况时,在语言规范中禁止这种不寻常的关系才更实际。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506329.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号