千家信息网

Scala的Predef对象有什么作用

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"Scala的Predef对象有什么作用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Scala的Predef对象有什么作用"吧!Scal
千家信息网最后更新 2025年12月02日Scala的Predef对象有什么作用

本篇内容主要讲解"Scala的Predef对象有什么作用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Scala的Predef对象有什么作用"吧!

Scala的Predef对象

隐式引用(Implicit Import)

Scala会自己主动为每一个程序加上几个隐式引用,就像Java程序会自己主动加上java.lang包一样。

Scala中。下面三个包的内容会隐式引用到每一个程序上。所不同的是。Scala还会隐式加进对Predef的引用。这极慷慨便了程序猿的工作。

import java.lang._ // in JVM projects, or system namespace in .NETimport scala._     // everything in the scala packageimport Predef._    // everything in the Predef object

上面三个包,包括了经常使用的类型和方法。java.lang包包括了经常使用的java语言类型,假设在.NET环境中,则会引用system命名空间。相似的,scala还会隐式引用scala包,也就是引入经常使用的scala类型。

请注意
上述三个语句的顺序藏着一点玄机。我们知道,通常,假设import进来两个包都有某个类型的定义的话,比方说,同一段程序。即引用了'scala.collection.mutable.Set'又引用了'import scala.collection.immutable.Set'则编译器会提示无法确定用哪一个Set。这里的隐式引用则不同,假设有同样的类型。后面的包的类型会将前一个隐藏掉。比方。java.lang和scala两个包里都有StringBuilder。这样的情况下,会使用scala包里定义的那个。java.lang里的定义就被隐藏掉了,除非显示的使用java.lang.StringBuilder

Predef对象

Predef提供经常使用函数

包scala中的Predef对象包括了很多实用的方法。比如,Scala源文件里写下println语句,实际调用的是Predef的println。Predef.println 转而调用 Console.println,完整真正的工作。

def print(x: Any) = Console.print(x)def println() = Console.println()def println(x: Any) = Console.println(x)def printf(text: String, xs: Any*) = Console.print(text.format(xs: _*)

断言函数assert以及相关函数也是在Predef中定义的:

** Tests an expression, throwing an `AssertionError` if false.*  Calls to this method will not be generated if `-Xelide-below`*  is at least `ASSERTION`.**  @see elidable*  @param assertion   the expression to test*/@elidable(ASSERTION)def assert(assertion: Boolean) {if (!assertion)  throw new java.lang.AssertionError("assertion failed")}/** Tests an expression, throwing an `AssertionError` if false.*  Calls to this method will not be generated if `-Xelide-below`*  is at least `ASSERTION`.**  @see elidable*  @param assertion   the expression to test*  @param message     a String to include in the failure message*/@elidable(ASSERTION) @inlinefinal def assert(assertion: Boolean, message: => Any) {if (!assertion)  throw new java.lang.AssertionError("assertion failed: "+ message)}

Predef定义类型别名

Predef是一个对象(Object)。这个对象中,定义一些类型别名。如:

scala.collection.immutable.List         // to force Nil, :: to be seen.type Function[-A, +B] = Function1[A, B]type Map[A, +B] = immutable.Map[A, B]type Set[A]     = immutable.Set[A]val Map         = immutable.Mapval Set         = immutable.Set

如今我们知道了。直接使用集合时,如List。Map。Set。用到的是immutable包中的对象。这是在Predef里定义的。

隐式转换

Predef对象定义了经常使用的隐式转换,如:

implicit final class any2stringadd[A](privateval self: A) extends AnyVal {  def +(other: String): String = String.valueOf(self) + other}

该隐式转换。给AnyVal的全部子类型都加上了+(other: String): String方法,便于在打印或其它字符串操作时,增加其它的值类型。

再如:

@inline implicit def augmentString(x: String): StringOps = new StringOps(x)@inline implicit def unaugmentString(x: StringOps): String = x.repr

该隐式转换,使得我们能够自由的对String使用StringOps的方法。
同理,数值类型的富包装(Rich Wrapper)也是这样实现的。

Scala程序猿能够较少关心装箱和拆箱操作,这也是因为Predef对象里定义了Scala值类型与java基本类型直接的隐式转换。

implicit def byte2Byte(x: Byte)           = java.lang.Byte.valueOf(x)implicit def short2Short(x: Short)        = java.lang.Short.valueOf(x)implicit def char2Character(x: Char)      = java.lang.Character.valueOf(x)implicit def int2Integer(x: Int)          = java.lang.Integer.valueOf(x)implicit def long2Long(x: Long)           = java.lang.Long.valueOf(x)implicit def float2Float(x: Float)        = java.lang.Float.valueOf(x)implicit def double2Double(x: Double)     = java.lang.Double.valueOf(x)implicit def boolean2Boolean(x: Boolean)  = java.lang.Boolean.valueOf(x)implicit def Byte2byte(x: java.lang.Byte): Byte             = x.byteValueimplicit def Short2short(x: java.lang.Short): Short         = x.shortValueimplicit def Character2char(x: java.lang.Character): Char   = x.charValueimplicit def Integer2int(x: java.lang.Integer): Int         = x.intValueimplicit def Long2long(x: java.lang.Long): Long             = x.longValueimplicit def Float2float(x: java.lang.Float): Float         = x.floatValueimplicit def Double2double(x: java.lang.Double): Double     = x.doubleValueimplicit def Boolean2boolean(x: java.lang.Boolean): Boolean = x.booleanValue

关于装箱(Boxing)和拆箱(Unboxing)
熟悉Java或C#等语言的读者会知道,装箱是指将原始类型转换成引用类型(对象)。用于须要对象的操作,而拆箱,则是把对象转换成原始类型,用于须要原始类型的场景。
因为数值类型本身已经是类对象,因此Scala里不须要装箱(boxing)和拆箱(unboxing)操作。

当然,Scala代码终于会执行在JVM上,所以实际上,始终会有装箱成Scala类对象,和拆箱成Java原始值类型的操作,可是这些操作是透明的,程序猿不须要关心(实际上,这是由定义在Predef中的隐式转换完毕的)。

到此,相信大家对"Scala的Predef对象有什么作用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

类型 对象 程序 方法 装箱 原始 实际 作用 三个 内容 函数 不同 实用 主动 两个 别名 实际上 数值 是在 语句 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 关于网络安全的请示报告卡 软件开发很难坚持下来 三星代理服务器验证失败 国外重大的网络安全事件 快速网络技术培训排行 台州国税安全接入服务器地址 制作一个数据库包括er图 安全控制中数据库分为三类 洛阳做直销网络技术公司 基层单位落实网络安全法的 正确的网络安全观 思政 丝路传说90数据库 数据库中kind什么意思 服务器防护盾价格 数据库连接池的最小连接数是 泰州纬立网络技术多少钱 为什么要设置网络安全法 未开启对服务器远程 怎么看数据库中数据格式 重庆网络安全inmoke 网络技术专业是什么 网络安全素质教育多少分及格 造成服务器内存过低的原因 数据库技术应用案例 北京映翰通网络技术薪资结构 git为啥拉不到服务器代码 网络安全宣传周展位介绍 天下手游 互通服务器 服务器加不加流版签软件 张家口人社服务器拒绝访问
0