JAVA 实现潜在类型机制 --《JAVA编程思想》 63

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点 将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点 阅读详情

为了尽可能地广泛应用代码,我们希望通过各类途径来放开类型所作的限制,但同时又不能丢失静态类型的检查。

在 Python 和 C++ 中便有这种解决方案,称为“潜在类型机制”或“结构化类型机制”。我们不关心具体类型,只要求实现某个方法子集(不要求是公共接口),我们便可进行调用。即“如果它走起来像鸭子,并且叫起来也像鸭子,那么你就可以将它当作鸭子对待”。

潜在机制类型可以横跨类继承结构,调用不属于某个公共接口的方法。

我们来看一段 Python 代码,如下所示:

class Dog:
	def speak(self):
		print "Arf!"
	def sit(self)
		print "Sitting!"
class Roboot:
	def speak(self):
		print "Click!"
	def sit(self)
		print "Clank!"
	def oilChange(self):
		pass
def perform(anything):
	anything.speak()
	anything.sit()
a = Dog()
b = Reboot()
perform(a)
perform(b)

anything 可以是任何类型,只要该对象支持 speak() 和 sit() 方法,就能正常执行,否则会得到运行时异常。

但 JAVA 中并不能直接支持潜在类型机制,需要我们实现一个类或者接口,调用公共方法才能达到此类需求。

public interface Action {

    void speak();

    void sit();

}
public class Dog implements Action{

    @Override
    public void speak() {
        System.out.println("Arf!");
    }

    @Override
    public void sit() {
        System.out.println("Sitting!");
    }

}
public class Reboot implements Action{

    @Override
    public void speak(){
        System.out.println("Click!");
    }

    @Override
    public void sit(){
        System.out.println("Clank!");
    }

    public void oilChange(){
        return;
    }

}


public class ActionTest {

    public static void action(Action action) {
        action.speak();
        action.sit();
    }

    public static void main(String[] args) {
        action(new Dog());
        action(new Reboot());
    }

}
Arf!
Sitting!
Click!
Clank!

Dog 和 Reboot 分别实现 Action 接口,再通过泛化的 Action 调用需要共用的 speak() 和 sit() 方法。

但这里需要注意的是,假设我们需要抽取的公共方法不同名该怎么办?如下面这个 Duck 类。

public class Duck {

    public void cry(){
        System.out.println("DA!");
    }

    public void down(){
        System.out.println("PU!");
    }
    
}

我们需要将 cry() 对应 speak() ,down() 对应 sit() ,该怎么办呢?

其实也不复杂,使用适配器模式,便可解决问题。

public class DuckAdapter extends Duck implements Action {

    @Override
    public void speak() {
        super.cry();
    }

    @Override
    public void sit() {
        super.down();
    }

}
public class ActionTest {

    public static void action(Action action) {
        action.speak();
        action.sit();
    }

    public static void main(String[] args) {
        action(new Dog());
        action(new Reboot());
        action(new DuckAdapter());
    }

}
Arf!
Sitting!
Click!
Clank!
DA!
PU!

DuckAdapter 继承 Duck ,实现 Action 接口,在实现接口的方法中再调用父类中需要作为共用的方法,从而更为优雅的实现潜在类型机制。

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

WiFi偏门协议(四):增强的传输机制802.11aa 区分Unicast和Multicast的优先级,以及设定不同的重传次数,以细化EDCA机制。 SCS(StreamClassification Service) 如上图,在VI,VO内各自又增加了一个queue, 对应不同的MAC header。VI和VO内的两个queue可以分别对应UC和MC。这样就提供了同一个AC内的更细粒度的优先级区分。当然还可以使用Drop Eligibility Indication子域来区分不同的重传次数。 改善Multicast数据传... 阅读详情

相关推荐

HITS算法详解及代码实现

占坑

蓁蓁尔的博客 7461

java大神潜在的十个特征

java以其简单,稳健,高效的特性对于编程来说是个不错的选择,那么我们该如何学习掌握这门语言呢?下面列举了一些关于学习java的一些心得,希望对大家有所帮助 1.订阅最新资讯 学习新技术首先要做的是订阅相关的技术社区论坛。我们并非是独行者。很多人都和我们一样在研究着相同的技术。只对某个框架概念做验证是不难,但是当你将这些概念应用到实际的项目中时,那么各种各样的问题,各种在搜索不到解决方

ma_wang_bo的博客 717

多仓智能订单路由与动态优化方案设计

现在有很多商家会有多个仓库,并分布在不同的城市中,当用户下单后会根据商品库存及订单信息将订单分配到对应的仓库进行发货,如就近原则,本期基于多仓库设计一套订单路由方案,包含核心逻辑、规则优先级和实施方案,适用于多仓协同的订单自动分配场景

14年产品经理老兵,想把自己的经验及总结分享给大家,只讲思路及实操,不讲废话 2481

JAVA 深入理解 潜在类型机制

潜在类型机制 Java不支持潜在类型泛化编程 但是可以利用接口、反射、适配器模拟 pyhton 支持潜在类型机制 class Dog: def speak(self): print("Dog") def sit(self): print("sitting") de

LEE 360

DP接口详解:从主链路到AUX通道的完整解析(附常见问题排查)

本文深入解析DP接口的三大核心子系统:主链路的高速数据传输、AUX通道的智能协商以及HPD信号线的即时响应。详细介绍了DP接口的物理层设计要点、链路训练与均衡技术,并提供了常见故障排查指南,帮助工程师解决实际应用中的技术难题。

weixin_30790841的博客 462

LoRaWAN数据包分析工具

前言:LoRaWAN的射频数据包是加密的,而且有些字段是某个字节的某几位,看着不是那么直观,因此在某些情况下需要借助工具来分析数据包。 1、安装npm 这个工具是用JavaScript写的,其中用到了一些依赖库,而npm就可以一次性把这些依赖库下载下来,因此我们先要下载安装npm这个工具。 安装:sudo apt install npm 输入y,等待安装完成: 检查是否安装成功:npm -v 说明安装完成。 2、安装LoRa数据包分析工具lora-packet 安装:npm i.

freemote的博客 4630

潜在类型机制

潜在类型机制是一种代码组织和复用机制,当用某个实例调用方法时,它只要求实现该实例实现了这些方法子集,而不用继承或实现某个接口,换句话说,程序不关心你什么类型,只要你的类型带有这些方法就行了,这样满足你可以横跨类继承结构,而调用不属于某个公共接口的方法, 代码例子: Python的实现class Dog: def speak(self); print "Arf!"

xuguoli_beyondboy的专栏 1186

【知识分享】什么是同轴传输线结构?

同轴传输线的几何形状由中心导体组,嵌在介电材料(Dielectric)中,并且,被连续的外导体所包围,也被称为屏蔽(Shield)。内外导体有相同的几何中心轴,因此得名同轴(Coaxial)。

一只豌豆象的博客 2372

Java中的潜在类型机制

感觉这一周一直在疯狂写博文,效果还是可以,只不过知识来的快忘得也快,好事要多复习才行。 先一句话介绍一下潜在类型机制到底是什么:潜在类型机制是一种代码组织和服用机制,简单的解释一下就是:只要多个类有同样的方法,那么就可以在使用这个方法时不关注类型。但准确的来说Java中并没有潜在类型机制,下面直接上代码: import typeinfo.pets.*; import static net...

可爱滴老唐 679

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化

本文介绍了在项目开发中实现坐标转换的方法,重点解析了两个关键函数UF_MTX4_csys_to_csys和UF_MTX4_vec3_multiply的使用。通过4个变换矩阵(transform1-4)实现工作坐标系与绝对坐标系之间的相互转换,并以圆柱体为例详细说明了坐标转换的具体实现过程,包括原点、X/Y轴方向的转换处理。相比之前采用的if-else判断方法,这种矩阵转换方式在代码复杂度和运行效率上都更具优势。

weixin_47753171的博客 599

YOLOv8【第十一章:视频追踪与流处理篇·第16节】一文搞懂,DeepStream 部署入门:NVIDIA 视频分析 SDK 与 YOLOv8 结合!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 838

JVM——Java的基本类型的实现

JVM——Java的基本类型的实现

从知识输入到知识输出 1199

【超详细】计算机操作系统总结及思维导图(汤子瀛版)

计算机操作系统 一.操作系统引论 1.操作系统的目标和功能 目标 方便性 有效性 提高系统资源利用率 提高系统吞吐量 可扩充性 开放性 作用 OS作为用户与计算机硬件系统之间的接口 命令方式 系统调用方式 图标–窗口方式 OS实现了对计算机资源的抽象 2.操作系统的发展过程 未配置操作系统的计算机系统 人工操作方式 用户独占全机 CPU等待人工操作 严重降低...

圣三一 2万+

【Java基础】Java数据类型以及数据类型之间的转换

Java数据类型小技巧,今天你学废了吗?

程序员青戈 6700

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 输出机制 数据类型 基本数据类型转换 基本数据类型和String类型的转换

输出机制[1.print和println的差别 2.可接收不同类型参数 3.输出函数中 + 符号的使用] Java 数据类型[1.整型类型 2.浮点类型 3.字符类型] 基本数据类型转换[1.自动类型转换 2.强制类型转换 3.练习题] 基本数据类型和String类型的转换[1.基本类型转String类型 2.String类型转基本类型]

咸鱼势力登场 1684

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java基础——数据类型(种类、包装类型、缓存机制、装拆箱、精度丢失)

Java基础——数据类型(种类、包装类型、缓存机制、装拆箱、精度丢失)

weixin_64451672的博客 890

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java的核心机制和基本数据类型

Java的核心机制和基本数据类型 1、 Java的核心机制 1、 java虚拟机(java Virtual Machine)简称:JVM 2、 垃圾收集机制(Garbage Collection)简称:GC; 垃圾收集的目的在移除不再使用的对象,当对象建立的时候垃圾收集器就开始监控对象的动态情况,垃圾收集主要是对内存的释放。创建对象的时候申请一个空间。 ① 不再使用的内存空间回收-垃圾收集 ② Java消除了程序员回收无用内存空间的职责;提供一种系统级线程跟踪存储空间的分配情况。在JVM空闲时...

HDW1203的博客 261

Java-基本数据类型、包装类、缓存机制、BigDecimal

在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

weixin_46711536的博客 1091

java编程思想总结1

一切都是对象 1.我们所创建的对象其实都是一种对象引用。 例:String s = “abcd”; 其中s是一个引用,访问的就是abcd. 2.对象存储到哪? 名称 解释 寄存器 处理器内部(不能自行控制) 堆栈 jvm里的虚拟机栈,他是通过堆栈指针进行对象的访问(存储对象引用) 堆 用于存放所有的java对象,清理内存没堆...

qq_27630375的博客 270

Java编程思想 第四版 读书笔记巩固基础,完善知识框架。

Java编程思想读书笔记 此笔记仅仅是作者的阅读此书时,发现自己错误认识和不牢固的知识,用来完善作者的知识框架,其列出重点不具有参考性,代码也是为了省工作量,简写代码,能看懂即可,语法并不规范。 此笔记会不定时更新,直至作者看书完结。 第一章 对象导论 第二章 一切都是对象 2.1 用引用操控对象 在java语言中操作内存的方式是通过“引用”,因为java中一切可以看做对象,而操作对象只需要对象的一个引用。 例如 String s为 String的引用 **注意:**它只是一个地址,并没有分配任何的存储空间

Akai__csdn的博客 533

【Java基础】分析java数据类型与自动装箱/自动拆箱机制原理

文章目录一. 八大基本数据类型二. 使用基本数据类型有什么好处三. 整数类型的取值范围四. 八大包装类型五. 自动拆箱与自动装箱六. 自动装箱/自动拆箱原理七. 分析自动拆装箱使用场景八. 自动拆装箱与缓存九.使用包装类弊端 一. 八大基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型。它们是使用最频繁的类型。 Java是一种强类型语言,第一次申明变量必...

墩墩分墩 783

【JAVA基础】基本数据类型

Java是一种强类型语言,它提供了一系列基本数据类型(也称为**原始数据类型**)。这些数据类型是预先定义的,可以直接使用,**不需要通过类来实例化**

2403_87669205的博客 1084

JAVA中的数据类型

在介绍java基本数据类型前,先介绍计算机中的基本单位-比特;

m0_69932385的博客 1643

java怎么改变数据类型_java基础系列—数据类型

个人博客,如果各位客官觉得不错,请点个赞,谢谢。博客地址​codefool0307.github.io注意:看似数据类型很基础,但是还是有很多知识点是需要掌握的,比如说Interger机制,还有包装类等1数据类型1.0 数据类型综述基本数据类型引用数据类型包装类型 文件更新1.1 基本数据类型一、基本概念基本数据类型一共分为了四大类,共八种| 数据类型 | 关键字 | 内存占用 | ...

weixin_29306261的博客 1137

【Java源码阅读系列63】深度解读Java WeakReference 源码

在Java的引用体系中,WeakReference(弱引用)是一种“最弱”的显式引用类型。其核心特性是:当一个对象仅被弱引用指向时,垃圾回收器(GC)会立即回收该对象(无论内存是否充足)。这种特性使其成为避免内存泄漏、实现轻量级缓存的重要工具。本文将基于JDK 8的WeakReference源码,深入解析其设计逻辑与核心机制。

专注Java和MySQL领域知识分享 899

Java 的八大基本类型及其包装类型(超级详细)

byte、short、int 和 long 都是用来表示整数,float 和 double 是用来表示浮点数的,那它们之间有什么区别和联系呢?引用类型 Integer 和 Long 也可以用来表示整数,那它们与int 和 long 又有什么区别和联系呢?这八种基本类型之间的运算关系又是怎样的呢?想知道就赶紧进来一探究竟吧!

小康2022的博客 4055
上一篇: 在JAVA中实现混型的两种方式 --《JAVA编程思想》 62
下一篇: 数组和集合的区别 --《JAVA编程思想》 64
BaymaxCS
博客等级 码龄9年 61粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值