Collection Casting & Custom Types

DEX455 - Apex 类、对象与接口完全指南

📄 第 145 页 🎬 视频课程

课程章节介绍

同学们,今天我们来聊一聊 Apex 中集合的一个特别方便的特性,就是它怎么跟自定义的类、接口,以及 sObject 一起使用,并且还能在类型之间灵活地转换。 首先,咱们都知道,集合无非就是列表(List)和映射(Map)。它们不光能存基本类型,比如字符串、数字,还能直接存 sObject,比如 Account、Contact 这些。更进一步,你可以把自己写的类、实现的接口当作集合里元素的类型。比方说,你可以定义一个 `List<我的订单类>`,或者一个 `Map`。也就是说,映射的键和值,都可以是用户自定义的数据类型,这样就能创建出完全契合你业务结构的对象集合。 重点来了——因为 Apex 在运行的时候,集合里的每个元素依然保留着它最真实的类型,所以 Apex 允许一种很安全的集合强制转换。听起来有点拗口,其实很好理解,就是“向上转型”。打个比方,假设你有一个父类叫 SecureOrder,然后有一个子类叫 CustomerSecureOrder,继承自它。现在,你手里有一个专门存放子类对象的列表:`List`。在 Apex 里,你可以直接把它赋给一个声明为父类类型的列表变量:`List`。这个过程,就是集合的强制转换。 这种转换之所以是安全的,因为你只是换了一个更宽泛的视角去看这个列表,列表里实际存的还是那些子类对象,你在取出来的时候,可以按照父类的标准去操作它们,这完全没问题。当然,你不能反过来把一个存着各种 SecureOrder 的列表强行当 `List` 用,除非里面的元素真的全都是子类的实例,否则运行时会报错。 地图也是类似的逻辑,不过只针对值这一侧。因为地图的键一旦定义了类型,就必须保持严格一致。规则是:如果地图 A 里存放的值类型,可以被安全地转换成地图 B 的值类型,并且它们键的类型完全相同,那么整个地图 A 就能被转换成地图 B。举个例子,你有一个 `Map`,就可以把它赋给 `Map` 变量。键都是 String,值从子类变成了父类,这个转换是允许的。 这种特性在编码的时候特别实用,能让你写出更通用的方法。比如一个方法接受 `List` 参数,你就可以传入任何具体 sObject 的列表,像 `List`、`List`,代码复用性一下就提高了。 好,这一页的核心就是:集合可以和类、接口自然结合,并且支持向父类型的安全转换,这让我们的代码既灵活又类型安全。大家理解这个思路了吗?我们下一节继续。

关键词

Apex Salesforce Developer Guide