立即前往

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 智算采购季 热销S6云服务器2核4G限时88元/年起,部分主机可加赠对象存储组合包!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 产品能力
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Scala教程之:静态类型

      首页 知识中心 其他 文章详情页

      Scala教程之:静态类型

      2023-03-22 09:34:26 阅读次数:425

      Scala

      文章目录

      • ​​协变​​
      • ​​逆变​​
      • ​​不变​​
      • ​​泛类型​​
      • ​​型变​​
      • ​​类型上界​​
      • ​​类型下界​​
      • ​​内部类​​
      • ​​抽象类型​​
      • ​​复合类型​​
      • ​​自类型​​
      • ​​隐式参数​​
      • ​​隐式转换​​
      • ​​多态方法​​
      • ​​类型推断​​

      Scala是静态类型的,它拥有一个强大的类型系统,静态地强制以安全、一致的方式使用抽象,我们通过下面几个特征来一一说明:

       

      • 泛类型
      • 型变
      • 类型上界
      • 类型下界
      • 内部类
      • 抽象类型
      • 复合类型
      • 自类型
      • 隐式参数
      • 隐式转换
      • 多态方法
      • 类型推断

      通过这些特性,为安全可重用的编程抽象以及类型安全的扩展提供了强大的基础。

      泛类型

      和java一样,Scala也有泛型的概念,在scala里面泛型是使用方括号 [] 来接受类型参数的。通常使用字母A来作为参数标志符,当然你也可以使用其他任意的参数名称。

      class Stack[A] {
        private var elements: List[A] = Nil
        def push(x: A) { elements = x :: elements }
        def peek: A = elements.head
        def pop(): A = {
          val currentTop = peek
          elements = elements.tail
          currentTop
        }
      }

       

      要使用一个泛类型,将一个具体的类型替换掉A即可。

      val stack = new Stack[Int]
      stack.push(1)
      stack.push(2)
      println(stack.pop)  // prints 2
      println(stack.pop)  // prints 1

       

      上面的例子中,实例对象接收整型值,如果该类型有子类型,子类型也是可以传入的。

      class Fruit
      class Apple extends Fruit
      class Banana extends Fruit
      
      val stack = new Stack[Fruit]
      val apple = new Apple
      val banana = new Banana
      
      stack.push(apple)
      stack.push(banana)

       

      型变

      型变主要是针对泛类型来说的,用来表示这种复杂类型的相关性。型变主要有协变,逆变和不变三种情况。在类型系统中使用型变允许我们在复杂类型之间建立直观的连接,而缺乏型变则会限制类抽象的重用性。

      class Foo[+A] // A covariant class
      class Bar[-A] // A contravariant class
      class Baz[A]  // An invariant class

       

      协变

      协变使用+A来表示。对于某些类 class List[+A],使 A 成为协变意味着对于两种类型 C 和 D,如果 C 是 D 的子类型,那么 List[C] 就是 List[D] 的子类型。 这允许我们使用泛型来创建非常有用和直观的子类型关系。

      abstract class Animal {
        def name: String
      }
      case class Cat(name: String) extends Animal
      case class Dog(name: String) extends Animal

       

      上面的例子中类型 Cat 和 Dog 都是 Animal 的子类型。那么

      List[Cat]和List[Dog]都是List[Animal]的子类。

      下面看下协变的应用:

      object CovarianceTest extends App {
        def printAnimalNames(animals: List[Animal]): Unit = {
          animals.foreach { animal =>
            println(animal.name)
          }
        }
      
        val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))
        val dogs: List[Dog] = List(Dog("Fido"), Dog("Rex"))
      
        printAnimalNames(cats)
        // Whiskers
        // Tom
      
        printAnimalNames(dogs)
        // Fido
        // Rex
      }

       

      在上面的例子中,方法 printAnimalNames 将接受动物列表作为参数,并且逐行打印出它们的名称。 如果 List[A] 不是协变的,最后两个方法调用将不能编译,这将严重限制 printAnimalNames 方法的适用性。

      逆变

      逆变和协变相反,使用-A来表示。对于某个类 class Writer[-A] ,使 A 逆变意味着对于两种类型 C 和 D,如果 C 是 D 的子类型,那么 Writer[D] 是 Writer[C] 的子类型。

      考虑一下的例子:

      abstract class Printer[-A] {
        def print(value: A): Unit
      }

       

      我们定义两个printer:

      class AnimalPrinter extends Printer[Animal] {
        def print(animal: Animal): Unit =
          println("The animal's name is: " + animal.name)
      }
      
      class CatPrinter extends Printer[Cat] {
        def print(cat: Cat): Unit =
          println("The cat's name is: " + cat.name)
      }

       

      如果 Printer[Cat] 知道如何在控制台打印出任意 Cat,并且 Printer[Animal] 知道如何在控制台打印出任意 Animal,那么 Printer[Animal] 也应该知道如何打印出 Cat 就是合理的。 反向关系不适用,因为 Printer[Cat] 并不知道如何在控制台打印出任意 Animal。 因此,如果我们愿意,我们应该能够用 Printer[Animal] 替换 Printer[Cat],而使 Printer[A] 逆变允许我们做到这一点。

      object ContravarianceTest extends App {
        val myCat: Cat = Cat("Boots")
      
        def printMyCat(printer: Printer[Cat]): Unit = {
          printer.print(myCat)
        }
      
        val catPrinter: Printer[Cat] = new CatPrinter
        val animalPrinter: Printer[Animal] = new AnimalPrinter
      
        printMyCat(catPrinter)
        printMyCat(animalPrinter)
      }

       

      不变

      默认情况下,Scala中的泛型类是不变的。这意味着虽然Cat是Animal的子类,但是Container[Cat]和Container[Animal]之间没有任何关系。

      类型上界

      像T <: A这样声明的类型上界表示类型变量T应该是类型A的子类。下面是个例子:

      abstract class Animal {
       def name: String
      }
      
      abstract class Pet extends Animal {}
      
      class Cat extends Pet {
        override def name: String = "Cat"
      }
      
      class Dog extends Pet {
        override def name: String = "Dog"
      }
      
      class Lion extends Animal {
        override def name: String = "Lion"
      }
      
      class PetContainer[P <: Pet](p: P) {
        def pet: P = p
      }
      
      val dogContainer = new PetContainer[Dog](new Dog)
      val catContainer = new PetContainer[Cat](new Cat)
      
      // this would not compile
      val lionContainer = new PetContainer[Lion](new Lion)

       

      类PetContainer接受一个必须是Pet子类的类型参数P。因为Dog和Cat都是Pet的子类,所以可以构造PetContainer[Dog]和PetContainer[Cat]。但在尝试构造PetContainer[Lion]的时候会得到下面的错误信息:

      type arguments [Lion] do not conform to class PetContainer's type parameter bounds [P <: Pet]

       

      这是因为Lion并不是Pet的子类。

      类型下界

      类型下界和类型上界相反,B >: A 表示类型参数 B 或抽象类型 B 是类型 A 的超类型。

      下面看个它使用的例子:

      trait Node[+B] {
        def prepend(elem: B): Node[B]
      }
      
      case class ListNode[+B](h: B, t: Node[B]) extends Node[B] {
        def prepend(elem: B): ListNode[B] = ListNode(elem, this)
        def head: B = h
        def tail: Node[B] = t
      }
      
      case class Nil[+B]() extends Node[B] {
        def prepend(elem: B): ListNode[B] = ListNode(elem, this)
      }

       

      这个例子会在编译的时候报错。因为方法 prepend 中的参数 elem 是协变的 B 类型。

      在scala中函数的参数类型是逆变的,而返回类型是协变的。

      要解决这个问题,我们需要将方法 prepend 的参数 elem 的型变翻转。 我们通过引入一个新的类型参数 U 来实现这一点,该参数具有 B 作为类型下界。

      trait Node[+B] {
        def prepend[U >: B](elem: U): Node[U]
      }
      
      case class ListNode[+B](h: B, t: Node[B]) extends Node[B] {
        def prepend[U >: B](elem: U): ListNode[U] = ListNode(elem, this)
        def head: B = h
        def tail: Node[B] = t
      }
      
      case class Nil[+B]() extends Node[B] {
        def prepend[U >: B](elem: U): ListNode[U] = ListNode(elem, this)
      }

       

      这样就可以了。

      内部类

      内部类就是class里面的class,在java里面,内部类被看成是外部类的成员。但是在scala中内部类是和外部类的对象进行绑定的。这意味着即使是同一个外部类的不同对象,其包含的内部类是不同类型的。 我们举个例子:

      class Graph {
        class Node {
          var connectedNodes: List[Node] = Nil
          def connectTo(node: Node) {
            if (!connectedNodes.exists(node.equals)) {
              connectedNodes = node :: connectedNodes
            }
          }
        }
        var nodes: List[Node] = Nil
        def newNode: Node = {
          val res = new Node
          nodes = res :: nodes
          res
        }
      }

       

      这里connectedNodes 中存储的所有节点必须使用同一个 Graph 的实例对象的 newNode 方法来创建。

      val graph1: Graph = new Graph
      val node1: graph1.Node = graph1.newNode
      val node2: graph1.Node = graph1.newNode
      val node3: graph1.Node = graph1.newNode
      node1.connectTo(node2)
      node3.connectTo(node1)

       

      这里三个node都是graph1.Node类型。如果是非graph1.Node类型则无法编译成功。

      val graph1: Graph = new Graph
      val node1: graph1.Node = graph1.newNode
      val node2: graph1.Node = graph1.newNode
      node1.connectTo(node2)      // legal
      val graph2: Graph = new Graph
      val node3: graph2.Node = graph2.newNode
      node1.connectTo(node3)      // illegal!

       

      那如果想达到和java中内部内中一样的效果,不区分路径该怎么办呢?使用Graph#Node即可。

      class Graph {
        class Node {
          var connectedNodes: List[Graph#Node] = Nil
          def connectTo(node: Graph#Node) {
            if (!connectedNodes.exists(node.equals)) {
              connectedNodes = node :: connectedNodes
            }
          }
        }
        var nodes: List[Node] = Nil
        def newNode: Node = {
          val res = new Node
          nodes = res :: nodes
          res
        }
      }

       

      抽象类型

      抽象类型通常用T来表示,用在特质和抽象类中,表示实际类型可以由具体的实现类来确认:

      trait Buffer {
        type T
        val element: T
      }

       

      通过抽象类来扩展这个特质后,就可以添加一个类型上边界来让抽象类型T变得更加具体。

      abstract class SeqBuffer extends Buffer {
        type U
        type T <: Seq[U]
        def length = element.length
      }

       

      复合类型

      复合类型很简单,表示多个类型的交集,用with来表示。

      假设我们定义了两个traits:

      trait Cloneable extends java.lang.Cloneable {
        override def clone(): Cloneable = {
          super.clone().asInstanceOf[Cloneable]
        }
      }
      trait Resetable {
        def reset: Unit
      }

       

      假如我们需要接受一个对象它即可以是Cloneable又可以是Resetable,那么可以这样定义:

      def cloneAndReset(obj: Cloneable with Resetable): Cloneable = {
        //...
      }

       

      自类型

      自类型的意思是在一个trait中可以使用另外一个trait中定义的属性而不必去继承它。

      要在特质中使用自类型,写一个标识符,跟上要混入的另一个特质,以及 =>(例如 someIdentifier: SomeOtherTrait =>)。

      trait User {
        def username: String
      }
      
      trait Tweeter {
        this: User =>  // 重新赋予 this 的类型
        def tweet(tweetText: String) = println(s"$username: $tweetText")
      }
      
      class VerifiedTweeter(val username_ : String) extends Tweeter with User {  // 我们混入特质 User 因为 Tweeter 需要
        def username = s"real $username_"
      }
      
      val realBeyoncé = new VerifiedTweeter("Beyoncé")
      realBeyoncé.tweet("Just spilled my glass of lemonade")  // 打印出 "real Beyoncé: Just spilled my glass of lemonade"

       

      因为我们在特质 trait Tweeter 中定义了 this: User =>,现在变量 username 可以在 tweet 方法内使用。 这也意味着,由于 VerifiedTweeter 继承了 Tweeter,它还必须混入 User(使用 with User)。

      隐式参数

      隐式参数由 implicit 关键字标记,在方法调用的时候,scala会去尝试获取正确的隐式类型值。

      Scala查找参数的位置有两个地方:

      • 首先查找可以直接访问的隐式定义和隐式参数。
      • 然后,它在所有伴生对象中查找与隐式候选类型相关的有隐式标记的成员。

      下面的例子定义了两个隐式类型,stringMonoid和intMonoid。

      abstract class Monoid[A] {
        def add(x: A, y: A): A
        def unit: A
      }
      
      object ImplicitTest {
        implicit val stringMonoid: Monoid[String] = new Monoid[String] {
          def add(x: String, y: String): String = x concat y
          def unit: String = ""
        }
        
        implicit val intMonoid: Monoid[Int] = new Monoid[Int] {
          def add(x: Int, y: Int): Int = x + y
          def unit: Int = 0
        }
        
        def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
          if (xs.isEmpty) m.unit
          else m.add(xs.head, sum(xs.tail))
          
        def main(args: Array[String]): Unit = {
          println(sum(List(1, 2, 3)))       // uses IntMonoid implicitly
          println(sum(List("a", "b", "c"))) // uses StringMonoid implicitly
        }
      }

       

      在 main 方法中我们调用了 sum 方法两次,并且只传入参数 xs。 Scala 会在上例的上下文范围内寻找隐式值。 第一次调用 sum 方法的时候传入了一个 List[Int] 作为 xs 的值,这意味着此处类型 A 是 Int。 隐式参数列表 m 被省略了,因此 Scala 将查找类型为 Monoid[Int] 的隐式值。

      intMonoid 是一个隐式定义,可以在main中直接访问。 并且它的类型也正确,因此它会被自动传递给 sum 方法。

      第二次调用 sum 方法的时候传入一个 List[String],这意味着此处类型 A 是 String。 与查找 Int 型的隐式参数时类似,但这次会找到 stringMonoid,并自动将其作为 m 传入。

      隐式转换

      简单点讲,隐式转换就是当需要的时候,将某个类型S转换到另外一个类型T。这是通过定义隐式函数来确定的。

      下面提供了一个隐式方法 List[A] => Ordered[List[A]] 的例子。

      import scala.language.implicitConversions
      
      implicit def list2ordered[A](x: List[A])
          (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
        new Ordered[List[A]] { 
          //replace with a more useful implementation
          def compare(that: List[A]): Int = 1
        }

       

      如果需要Ordered[List[A]] 而你传入List[A]的时候,scala会自动去寻找隐式的类型转换方法。

      下面是一个从scala.Int到java.lang.Integer的转换:

      import scala.language.implicitConversions
      
      implicit def int2Integer(x: Int) =
        java.lang.Integer.valueOf(x)

       

      多态方法

      Scala中多态是通过类型和值的参数化来实现的。 如下所示:

      def listOfDuplicates[A](x: A, length: Int): List[A] = {
        if (length < 1)
          Nil
        else
          x :: listOfDuplicates(x, length - 1)
      }
      println(listOfDuplicates[Int](3, 4))  // List(3, 3, 3, 3)
      println(listOfDuplicates("La", 8))  // List(La, La, La, La, La, La, La, La)

       

      上例中第一次调用方法时,我们显式地提供了类型参数 [Int]。 因此第一个参数必须是 Int 类型,并且返回类型为 List[Int]。

      上例中第二次调用方法,表明并不总是需要显式提供类型参数。 编译器通常可以根据上下文或值参数的类型来推断。 在这个例子中,“La” 是一个 String,因此编译器知道 A 必须是 String。

      类型推断

      Scala 编译器通常可以推断出表达式的类型,因此你不必显式地声明它。

      val businessName = "Montreux Jazz Café"

       

      编译器可以发现 businessName 是 String 类型。

      你也可以省略方法返回类型:

      def squareOf(x: Int) = x * x

       

      编译器可以推断出方法的返回类型为 Int,因此不需要明确地声明返回类型。

      当调用 多态方法 或实例化 泛型类 时,也不必明确指定类型参数。 Scala 编译器将从上下文和实际方法的类型/构造函数参数的类型推断出缺失的类型参数。

      看下面两个例子:

      case class MyPair[A, B](x: A, y: B)
      val p = MyPair(1, "scala") // type: MyPair[Int, String]
      
      def id[T](x: T) = x
      val q = id(1)              // type: Int

       

      编译器使用传给 MyPair 参数的类型来推断出 A 和 B 的类型。对于 x 的类型同样如此。

       

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/flydean/2720048,作者:程序那些事,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:python学习——迭代

      下一篇:Django入门:第三章、Hello World

      相关文章

      2025-04-11 07:08:33

      Scala 类和对象与Java的对比

      Scala 类和对象与Java的对比

      2025-04-11 07:08:33
      public , Scala , 动态 , 对象 , 属性 , 方法 , 绑定
      2025-03-31 08:48:59

      Spark+AI案例实战之第1阶段Scala编程第016讲:Scala中List剖析及代码实战

      Spark+AI案例实战之第1阶段Scala编程第016讲:Scala中List剖析及代码实战

      2025-03-31 08:48:59
      AI , List , Scala , 实战
      2024-09-25 10:14:34

      Scala的自定义类型标记

      Scala的自定义类型标记

      2024-09-25 10:14:34
      Scala , 类型 , 自定义
      2024-06-13 08:07:37

      Scala的Higher-Kinded类型

      Scala的Higher-Kinded类型

      2024-06-13 08:07:37
      Scala
      2024-05-15 09:01:07

      154 Scala编译器安装(Linux)

      154 Scala编译器安装(Linux)

      2024-05-15 09:01:07
      Linux , Scala
      2024-04-26 08:53:21

      Scala数据类型

      Scala数据类型

      2024-04-26 08:53:21
      java , Scala
      2024-04-26 08:53:21

      Scala选择分支if else

      Scala选择分支if else

      2024-04-26 08:53:21
      html , Scala
      2024-04-26 08:53:21

      Scala 匿名函数

      Scala 匿名函数

      2024-04-26 08:53:21
      Scala , 匿名函数
      2024-04-26 08:53:21

      Scala变量和常量的声明

      Scala变量和常量的声明

      2024-04-26 08:53:21
      Scala , 操作符
      2024-04-26 08:53:21

      Scala编译原理

      Scala编译原理

      2024-04-26 08:53:21
      Scala , 面向对象
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      32777

      阅读量

      4843768

      查看更多

      最新文章

      Scala的自定义类型标记

      2024-09-25 10:14:34

      Scala的Higher-Kinded类型

      2024-06-13 08:07:37

      Scala编译原理

      2024-04-26 08:53:21

      Scala 匿名函数

      2024-04-26 08:53:21

      Scala变量和常量的声明

      2024-04-26 08:53:21

      Scala 中断循环

      2024-04-26 08:53:21

      查看更多

      热门文章

      Scala教程之:PartialFunction

      2023-03-24 10:30:52

      Scala教程之:Scala基础

      2023-03-22 09:46:57

      Scala的存在类型

      2023-03-23 06:20:40

      Scala教程之:函数式的Scala

      2023-03-24 10:32:07

      Scala教程之:Future和Promise

      2023-03-22 09:46:57

      Scala的自定义类型标记

      2024-09-25 10:14:34

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 容器 spring 节点
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Scala教程之:Enumeration

      Scala教程之:可扩展的scala

      Scala教程之:函数式的Scala

      Scala教程之:Scala基础

      Scala的Higher-Kinded类型

      Scala的存在类型

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 权益商城
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 权益商城
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号