一分钟看懂 Scala 泛型

发布时间:2026/6/27 19:47:31
一分钟看懂 Scala 泛型 一、泛型到底是什么不管是 Scala 还是 Java泛型的核心作用只有一个代码复用 类型安全。简单说写一个通用的容器/方法不用为Int、String、自定义对象 重复写多套代码同时编译期校验类型杜绝强制类型转换报错。新手记住一句话泛型就是「给类型传参」。符号[]类名[T]叫泛型Generic[]里面是类型参数。 作用让一个类可以适配任意数据类型不用重复写多套代码。对比 JavaJavaListString用ScalaList[String]用[]二、Scala 泛型 vs Java 泛型核心区别这是新手最容易懵的点两者逻辑完全一致只有语法和能力差异表格一目了然对比维度Java 泛型Scala 泛型语法符号尖括号方括号[]最大区别类型推断弱很多场景需要手动声明类型极强大部分场景可自动推导不用写泛型通配符? extends T、? super TPECST、-T协变/逆变更简洁强大功能复杂度基础够用功能单一支持高阶泛型、类型约束适配函数式编程运行机制类型擦除同样基于类型擦除完全兼容Java泛型新手终极口诀Java 用尖括号Scala 用方括号Scala 少写代码自动推断更智能。三、左右对照 DemoJava Scala 同款功能用最简单的「泛型容器类」对比语法差异。1. Java 泛型写法// 自定义泛型容器 T public class BoxT { private T value; public Box(T value) { this.value value; } public T getValue() { return value; } public static void main(String[] args) { BoxInteger intBox new Box(100); BoxString strBox new BoxScala); System.out.println(intBox.getValue()); // 100 System.out.println(strBox.getValue()); // Scala } }2. Scala 同款泛型写法更简洁import scala.reflect.runtime.universe._ // 自定义泛型容器 [T]一行搞定类定义 class Box[T](val b: T) // 通用打印类型工具方法Scala 2.12 不允许顶层 def需放进 object object TypeUtils { def printFullType[T: TypeTag](obj: T): Unit { println(typeOf[T]) } } object GenericDemo extends App { import TypeUtils._ // 1. 显式指定泛型类型新手推荐清晰易懂 val intBox: Box[Int] new Box[Int](100) val strBox: Box[String] new Box[String](Scala) // 2. Scala 超强类型推断不用写泛型自动推导 val autoBox new Box(0.123) println(intBox.b) // 100 println(strBox.b) // Scala println(autoBox.b) // 0.123 printFullType(intBox) // Box[Int] printFullType(strBox) // Box[String] printFullType(autoBox) // Box[Double] }build.sbt — 加上依赖:org.scala-lang % scala-reflect % 2.12.8四、总结符号差异JavaTScala[T]仅此语法区别核心逻辑一致核心价值统一模板、适配任意类型、编译期防错、无需强制转型Scala优势类型推断强大大部分场景可省略泛型声明代码更简洁高频场景Option[T]、List[T]、Map[K,V]是日常开发必用泛型。