小编典典

Java使实现类明确声明其实现的接口的设计选择就是设计选择。可以肯定的是,JVM已经针对此选择进行了优化,并且除非添加了一些新的JVM指令,否则 现在

可能要付出额外的代价来实现另一个选择(例如Scala的结构化类型)。

那么设计选择到底 是 什么呢?一切都归结为方法的语义。考虑:以下方法在语义上是否相同?

draw(String graphicShapeName)

draw(String handgunName)

draw(String playingCardName)

这三种方法都具有签名draw(String)。人们可能会通过使用参数名或阅读一些文档来推断他们具有不同的语义。机器有什么方法可以告诉他们它们不同吗?

Java的设计选择是要求类的开发人员明确声明一种方法符合预定义接口的语义:

interface GraphicalDisplay {

...

void draw(String graphicalShapeName);

...

}

class JavascriptCanvas implements GraphicalDisplay {

...

public void draw(String shape);

...

}

毫无疑问,其中的draw方法JavascriptCanvas旨在与draw图形显示的方法匹配。如果有人试图通过将要拔出手枪的物体,则机器可以检测到错误。

Go的设计选择更为自由,并允许在事后定义接口。具体的类无需声明其实现的接口。而是,新纸牌游戏组件的设计者可以声明提供纸牌的对象必须具有与签名匹配的方法draw(String)。这样做的好处是,可以使用具有该方法的任何现有类,而无需更改其源代码,但是缺点是该类可能会拔出手枪而不是纸牌。

鸭式语言的设计选择是完全放弃形式化接口,并简单地匹配方法签名。接口(或“协议”)的任何概念都是纯惯用语,没有直接的语言支持。

这些只是许多可能的设计选择中的三个。这三个可以概括如下:

Java:程序员必须明确声明他的意图,然后机器会对其进行检查。假设程序员可能会犯语义错误(图形/手枪/卡)。

继续:程序员必须声明其意图的至少一部分,但是检查机器时机器可以继续运行。假设程序员可能会犯一个笔误(整数/字符串),而不会犯语义上的错误(图形/手枪/卡)。

鸭式打字:程序员无需表达任何意图,机器无需检查。假定程序员不太可能犯文书或语义错误。

解决接口和一般键入是否足以测试笔误和语义错误超出了此答案的范围。完整的讨论将不得不考虑构建时编译器技术,自动化测试方法,运行时/热点编译以及许多其他问题。

公认的draw(String)是,故意夸大示例以说明问题。实际示例将涉及更丰富的类型,这些类型将提供更多线索来消除方法的歧义。

2020-11-16

java声明接口_为什么必须用Java声明接口?相关推荐

  1. java定义接口_一文知道Java中接口的定义

    使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: 方法:接口中的方法只有定义而没有被实现. ...

  2. java收款编程_农行网上支付平台-商户接口编程指南-Java_Edition-V3.1.6.pdf

    [实例简介] [实例截图] 目录 1. 简介.............................................................................. ...

  3. java 网银支付收款接口_农行网上支付平台-商户接口编程指南-Java_Edition-V3.0.2.pdf...

    农行网上支付平台-商户接口编程指南-Java_Edition-V3.0.2 中国农业银行网上支付平台 商户接口编程指南 Java Edition V3.0.2 农行网上支付平台 商户接口编程指南 –J ...

  4. java 头尾 队列_超详细的java集合讲解

    1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...

  5. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  6. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  7. 计算机java语言答案_【计算机二级Java语言】卷019

    选择题 公共知识 [1]下列叙述中正确的是 [A]算法的时间复杂度与计算机的运行速度有关 [B]算法的时间复杂度与运行算法时特定的输入有关 [C]算法的时间复杂度与算法程序中的语句条数成正比 [D]算 ...

  8. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

  9. 学java 的要点_零基础学Java,掌握Java的基础要点

    对于程序员群体来说,了解一定的技巧会对学习专业技能更有帮助,也更有助于在自己的职业发展中处于有利地位,无限互联Java培训专家今天就为大家总结Java程序员入门时需要掌握的基础要点: 掌握静态方法和属 ...

最新文章

  1. java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
  2. VS2005工程由Pocket PC 2003 SDK转为WINCE6.0 SDK的问题
  3. 怒肝 8 个月源码,我成为了 Spring 开源贡献者
  4. python四边形转矩形_python opencv minAreaRect 生成最小外接矩形的方法
  5. DataSet里的数据写入XML文件
  6. 贡献一个新浪的幻灯片(javascript)
  7. k3导入账套_金蝶k3凭证导入导出的操作方法金蝶k3操作指南
  8. Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)
  9. SpringCloud微服务后台管理系统
  10. Java 删除session实现退出登录
  11. 大兴机场停车场长期停车怎么收费,大兴机场p3停车场收费标准
  12. 谷歌神经网络机器翻译NMT:人人可利用TensorFlow快速建立翻译模型
  13. 火狐浏览器设置背景图片
  14. Maven基础-认识Maven
  15. HTML:如何设置网页标题上的图标
  16. 二代旅游CMS网站管理系统使用手册(二)--目的地管理
  17. 如何删除windows的WSL
  18. 使用Python快速生成二维码的两种方式及二维码解码
  19. 如何批量下载天堂图片网上多个精美作品并保存一个目录
  20. 火箭还是飞机?-- DevOps 的两种模式

热门文章

  1. vsftpd 配置-掉坑记
  2. CSS实现三栏布局(5种)
  3. php5.4之分布式缓存memcache(windows7下安装配置)
  4. 斯坦福-随机图模型-week1.4_
  5. 在Ubuntu Server14.04上编译Android6.0源码
  6. form的get与post方式的区别(转)
  7. 十、Axis WebService常用命令和调试工具
  8. Android音视频【一】H264编码基础
  9. python 检查代码规范_Python代码规范检测
  10. Emacs之hs-minor-mode折叠代码