Lambda FAQ_16.钻石问题
来源:互联网 发布:网络规划工程师 编辑:程序博客网 时间:2024/04/27 09:16
钻石问题
“钻石问题”是允许多继承所带来的问题。对于允许状态的多继承语言来说(比如C++)这是一个严重的问题。但是,在Java中是不允许类的多继承,仅仅允许接口多继承,所以是不包含状态的。
考虑下面的场景:
interface A { default void m() { ... } }interface B extends A {}interface C extends A {}class D implements B, C {}
根据上一章节说明的默认方法选择规则,在类似这种场景中Java会有一种简单直接的解释方法。
如上代码所示的这种场景,D所继承的m方法的实现是没有歧义的,因为m方法只在A中定义。如果情况改变一下,B也声明了方法m的实现,那么D就会应用“最明确的实现”这一规则。但是如果B和C都提供了m的默认实现,那么就会产生歧义,这时D就必须提供m的复写声明,可能是使用`X.super.m(..)`这种语法来显示的选择一个继承的实现。这三种情况都在上一章节的“方法决议规则”中明确说明了。
默认方法和Java中所有的方法一样,是虚拟的。这个有时会产生一些令人惊讶的结果。例如给定下面的声明:
interface A { default void m() { System.out.println("hello from A"); }}interface B extends A { default void m() { System.out.println("hello from B"); }}interface C extends A {}class D implements B, C {}
下面的代码:
C c = new D();c.m();将会打印出hello from B。静态的类型C并不重要,关键的是实际的类型是D,而D最明确的m声明是从继承B而来的。
原文地址
原文地址
0 0
- Lambda FAQ_16.钻石问题
- 独立钻石跳棋问题
- DiamondProblem(钻石问题)
- 【转自cnblogs】钻石问题
- 钻石问题 diamond problem 多继承问题
- 独立钻石跳棋问题的C++实现
- C++名字冲突问题和钻石继承
- 钻石继承的构造函数问题
- 抽钻石vs中奖门 概率问题
- 关于钻石太多的显示问题
- C++之钻石问题和解决方案(菱形继承问题)
- C++之钻石问题和解决方案(菱形继承问题)
- 钻石问题(菱形继承问题) 和虚继承
- lambda 一个访问问题
- lambda引出的问题
- 【面试题】:海盗分钻石问题(典型倒推)
- lambda表达式的日期问题
- Java8 Lambda表达式性能问题
- C#给线程传递参数有3种方式
- 简明python教程学习笔记之九-(字典)
- Android Application类
- ADT国内更新
- 色相环
- Lambda FAQ_16.钻石问题
- Java替换汉字字符串中的数字或小数
- JavaScript 判断 Chrome 内核的 360 浏览器(关闭页面并提示)
- js 操作单选框
- spring中事务的注解配置优先级别
- ITxlab倡议启动“互联网X大脑”计划
- nyoj 571 整数划分(三)
- 关键字 mutable (c++)
- Amazing Charts In Rails