scala抽象类型

35、Scala 中的抽象类型与相关特性 本文介绍了 Scala 中的抽象类型及相关特性,包括抽象类型的基本概念及其在动物饮食建模中的应用、路径依赖类型的特性与 Java 内部类的区别、细化类型的使用场景、枚举的实现方式,以及一个复杂的货币系统设计案例。该案例深入探讨了如何通过抽象类型、工厂方法和货币区域划分实现类型安全的货币运算和货币转换功能,并展示了设计过程中的迭代改进思路。 阅读详情

(通过一个例子来说明抽象类型的用法,假定你需要为动物的饮食习性建模, 你可能会定义如下的数据结构:


class Food
abstract class Animal {
    def eat(food: Food)
}
然后呢可能需要实现两个不同的实类对于与牛和草 Cows和Grass

class Grass extends Food
class Cow extends Animal {
    override def eat(food: Grass) {}
}

但是这段代码编译不通过:


<console>:13: error: class Cow needs to be abstract, since method eat in class Animal of type (food: Food)Unit is not defined
(Note that Food does not match Grass: class Grass is a subclass of class Food, but method parameter types must match exactly.)
       class Cow extends Animal {
             ^
<console>:14: error: method eat overrides nothing.
Note: the super classes of class Cow contain the following, non final members named eat:
def eat(food: Food): Unit
       override def eat(food: Grass) {}

怎么会出错呢,这是因为类 Cow 中的 eat 不能重载其父类,这是因为参数类型不一致,Animal 中 food 类型为 Food,而 Cow 中类型为 Grass。 仅管有人会说 Grass 是 Food 的子类,编译器没有必要这么严格。但是如果编译器允许这种情况存在,那么很快就出现新问题了:

假定前面的编译没有问题,我们在定义一个Fish类


class Fish extends Food
val bessy: Animal = new Cow
bessy eat (new Fish)

问题来了,我们给牛喂了鱼。如果前面的 Cow 可以编译通过的话,这段代码也是合法的[1],但结果却显然不对,因此编译器编译不通过 Cow 是有道理的。 对于这个问题,我们可以通过抽象类型来解决,哪种动物吃哪种食物由动物决定:



class Food
abstract class Animal {
    type SuitableFood <: Food
    def eat(food:SuitableFood)
}

当定义新的 Animal 子类时,动物只能吃合适的食物,而 Animal 类本身不能决定那种食物合适,因此我们使用抽象类型定义。 但这个抽象类型有类型上界限制,表示 Animal 子类中使用的 SuitableFood 必须是 Food 的子类。

我们重新定义 Cow 如下:


class Grass extends Food
class Cow extends Animal {
    type SuitableFood = Grass
    override def eat(food:Grass) {}
}

你现在再试试喂鱼给牛看看:


scala> class Fish extends Food
defined class Fish

scala> val bessy :Animal = new Cow
bessy: Animal = Cow@a0992a

scala> bessy eat (new Fish)
<console>:14: error: type mismatch;
 found   : Fish
 required: bessy.SuitableFood
              bessy eat (new Fish)
                         ^
注释1:

When you assign bessy, you upcast the Cow instance to an Anmial:

val bessy: Animal = new Cow

35、Scala 类型系统深入解析:抽象类型、自类型注解与结构类型 本文深入探讨了 Scala 类型系统的三大核心特性:抽象类型、自类型注解和结构类型。通过具体代码示例,解析了抽象类型在类型家族设计中的应用,以及其与参数化类型的对比;介绍了自类型注解如何解决类型不匹配问题,并在模块集成和观察者模式中的实际应用;同时讨论了结构类型作为类型安全的鸭子类型实现方式,及其在降低耦合方面的优势与局限。文章旨在帮助开发者根据实际需求选择合适的类型机制,构建高效、灵活、类型安全的 Scala 应用。 阅读详情

相关推荐

35、Scala 类型系统深入剖析:抽象类型、自类型注解与结构类型

本文深入剖析了 Scala 类型系统中的三大核心机制:抽象类型、自类型注解和结构类型。通过丰富的代码示例,详细阐述了它们的使用场景、优势及潜在问题。同时,文章还探讨了参数化类型与抽象类型的对比,自类型注解如何解决类型问题,以及结构类型在降低耦合度方面的应用。最后,通过一个社交网络系统的综合示例,展示了这些类型机制的实际应用与优化策略。适合希望深入理解 Scala 类型系统、提升代码设计能力的开发者阅读。

git9versioner的博客 115

抽象类型

在本专题开始,我们看到“Type T”的用法,这是声明一个抽象类型,本篇介绍这种声明的意义和用途。和其它类型的抽象类型一样,抽象类型定义也是定义了一个“占位符”类型,其具体定义由其子类声明。不同的子类可以定义不同T的具体类型。 下面我们通过一个例子来说明抽象类型的用法,假定你需要为动物的饮食习性建模, 你可能会定义如下的数据结构:class Food abstract class Animal {

lingerxu的博客 392

大数据系列修炼-Scala课程58

大数据系列修炼-Scala课程58核心内容: 1、Scala中抽象类型(Abstract Types)操作代码实战1、Scala中抽象类型(Abstract Types)操作代码实战1>在Scala当中使用type关键字定义抽象类型,所谓抽象类型就是没有指明具体类型的类型 2>Scala中的抽象类型可以在trait(特质)、class、abstract class中进行定义,并在子类中进行实现

什么最重要?算法!! 1353

scala学习笔记 - 高阶函数

作为值的函数 在Scala中,函数是“头等公民”,就和数字一样。你可以在变量中存放函数: scala> import scala.math._ import scala.math._ scala> val num = 3.14 num: Double = 3.14 scala> val fun = ceil _ fun: Double => Double = <function1> scala> fun(num) res0: Double = 4.0 从技术

LW_ICE 467

C#连接数据库报Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ fail

所以导致的,除了上边的办法,还可以把这个加密规则修改一下,这个的修改方式有很多,具体原因是因为MySQL8.0以前的加密规则是。

weixin_42209881的博客 4129

【一键搞定】ThinkPHP6.0.2+PHPStudy+Composer极速安装指南——附完整下载包与避坑技巧

本文提供了一份ThinkPHP6.0.2的完整下载包,并详细介绍了如何配合PHPStudy和Composer进行极速安装与配置。指南涵盖了环境准备、Composer国内镜像加速、项目部署及常见避坑技巧,旨在帮助开发者,尤其是内网或网络不佳的用户,快速搭建可运行的TP6开发环境,绕过依赖下载的繁琐步骤。

assembly8low的博客 1008

scala 抽象方法_Scala抽象类型

scala 抽象方法The type whose identity is not known precisely can be termed as abstract type. 身份未知的类型可以称为抽象类型 。 Scala抽象成员 (Scala Abstract Members) A member is said to be abstract if the member does not h...

从零开始的教程世界 890

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

精准农业是现代农业发展的核心方向,其中杂草的实时、准确检测是减少除草剂滥用、实现变量喷施的关键技术瓶颈。本文详细阐述了一套完整的、基于YOLO(You Only Look Once)系列目标检测算法的田间杂草检测系统。系统覆盖从模型对比选型(YOLOv5, YOLOv6, YOLOv7, YOLOv8)、自定义数据集构建与标注、模型训练与优化,到最终构建基于PyQt5/FastAPI/Gradio的可视化UI界面的全流程。本文提供了完整的Python代码、项目结构、训练技巧及公开数据集指引,旨在为农

YOLO 358

浅析scala传名调用和传值调用,: => 与() : =>

函数调用一般传值调用,但是,在某些情况下,我们不希望函数的值首先被计算,而是等到调用的时候再来进行计算,为了适应这种情景,scala提供了传名调用。 先来看两个例子: package test/** * Created by layne on 05/05/17. */ object Test { def byValue(code: () => Unit): Unit = { p

layne的博客 2296

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1151

福彩快乐8智能选号系统研究

本文介绍了一款福彩快乐8智能选号系统的开发过程。系统首先通过数据采集获取历史开奖数据,作为分析的基础。随后,对采集的数据进行深入分析,以识别可能的模式和趋势。基于这些分析,系统能够智能预测未来的开奖号码,如2025129期的预测。最后,通过模拟兑奖功能,用户可以直观地看到预测结果的实际效果。文章鼓励感兴趣的读者点赞并领取源代码,以便自行探索和使用该系统。

gumuzi1210的博客 2216

Scala抽象类型

1 package big.data.analyse.scala 2 3 import scala.io.{BufferedSource, Source} 4 5 /** 6 * 抽象类型 7 * Created by zhen on 2019/1/6. 8 */ 9 trait Reader{ 10 type url <: jav...

weixin_33962621的博客 187

C语言关键字static的绝妙用途

为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字,在局部变量中,变量仅限于局部可见,在全局区中,static变量或函数仅限于本文件可见,当然还有一个重要的特性被忽略了。。。。       就是static修饰的局部变量 它的数值 是上一次函数调用结

Bruce.yang的嵌入式之旅 5378

scala 抽象方法泛型_Scala中的抽象类型与泛型

scala 抽象方法泛型 Scala抽象类型与泛型 (Scala Abstract types vs Generics) 抽象类型 (Abstract type) Abstract types have abstract members i.e.their members do not have the definition or the values. Traits and abstract...

cumtb2009的博客 537

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 350

YOLOv11涨点改进 | 首发全网创新、主干改进篇 | AAAI 2026 | PartialNet 主干让 YOLOv11 更加强大!引入部分通道机制 和 部分注意力卷积,全方面提升了模型的性能

本文提出PartialNet主干网络改进YOLOv11的方法,通过部分通道机制(PCM)和部分注意力卷积(PATConv)提升模型效率。PartialNet将特征图通道拆分并应用不同操作,显著减少计算量和内存占用。主要创新包括:1)部分通道机制实现计算优化;2)三种注意力模块(PATch/PATsp/PATsf)增强特征提取;3)动态部分卷积(DPConv)自适应调整计算复杂度。文章详细提供了代码实现和YOLOv11集成方法。

Ai缝合怪、助力小伙伴高效发论文 268

Scala 入门-抽象类型(type)

专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。 Scala 编程语言专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Scala 编程语言 什么是抽象类型 特质和抽象类可以包含一个抽象类型成员,由 type 关键字定义,实际类型可以在具体实现类中定义。 trait Buffer { type T // 抽象类...

2.wa 817

IMSL CNL 7.0.0 (x86-64)Crack

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

scala进阶16-抽象类型

import scala.io.{BufferedSource, Source} /** * 用type关键字定义抽象类型 * 抽象类型可用在方法中 */ trait Reader { type In <: java.io.Serializable //抽象类型限定为可序列化的(In的上界) type Contents def read(in: In): Contents

千里冰封 384

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Scala 抽象类型Type

Scala 抽象类型Type实例。

残缺的孤独 775

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Scala之旅:抽象类型

Scala之旅:抽象类型 A Tour of Scala: Abstract Types 在Scala中,类通过值(构造函数参数)与类型(如果类是泛型)被参数化(parameterized)。为了保持一致性,值无法成为对象成员,只有拥有值的类型才能成为对象成员。成员的两种形态可以是具体的或抽象的。 以下范例展示了如何将一个延迟值以及一个抽象类型都...

weixin_33913377的博客 98

Scala 抽象类型、复合类型、自类型

抽象类型 特质与抽象类可以具有抽象类型成员,这意味着具体实现将会定义这些成员的实际类型。通常,使用抽象类型的特质或类常常与匿名类实例化一起使用。 # 定义特质(使用抽象类型) trait Buffer { type T val element: T } # 定义抽象类(使用抽象类型) abstract class SeqBuffer extends Buffer { type U ...

小黑王HK 240

scala java抽象理解_Scala:抽象类型与泛型

您可以将抽象类型与类型参数结合使用来建立自定义模板。我们假设您需要建立一个具有三个连接特征的模式:traitAA[B,C]traitBB[C,A]traitCC[A,B]在类型参数中提到的参数的方式是AA,BB,CC本身您可能会附带某种代码:traitAA[B由于类型参数键,这不会以这种简单的方式工作。你需要使它协变才能正确继承traitAA[+B这个样本会编译,但它对方差规则提出了很高...

weixin_39598501的博客 132

# Scala之旅(TOUR OF SCALA)——抽象类型(ABSTRACT TYPES)

特征和抽象类可以有抽象类型的成员。这意味着实际的类型定义具体的实现。这里有一个例子: trait Buffer { type T val element: T } 这里我们定义了一个抽象 type T 。它被用来描述 element 的类型。我们能在抽象类中继承这个特征,添加 T 的类型上限让它更明确。 abstract class SeqBuffer extends B...

Czuaphe的博客 241

scala中的抽象类型成员和泛型类型参数

在学习scala过程中一个常见的问题是:当你需要建立抽象类型时,抽象类型成员和泛型类型参数如何抉择?对于那些不熟悉差异的人来说,Scala中的类型参数类似于Java中的类型参数,除了Java的尖括号: interface Collection&lt;T&gt; { // ... } scala使用方括号: // Type parameter version trait Col...

csdn19900419的博客 785

类型系统精讲:一文读懂 programming-scala-book-code-examples 中抽象类型、交集/联合类型与路径依赖

Scala 的类型系统向来是开发者又爱又恨的"深水区"。本文基于 **programming-scala-book-code-examples**(O'Reilly《Programming Scala》第 2/3 版的官方配套代码库),精讲其中最具代表性的三大类型机制:**抽象类型**、**交集/联合类型**与**路径依赖类型**。作为一份面向新手的完整类型系统学习指南,我会用最小化的代码、直观的

gitblog_00030的博客 1142
上一篇: 使用 Java 配置进行 Spring bean 管理
下一篇: Mybatis 批量插入的方法
DViewer
博客等级 码龄16年 16粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值