Kotlin 泛型

2024 年 8 月 29 日 | 阅读 3 分钟

泛型 是强大的特性,允许定义可以使用不同类型的类、方法和属性等。 类、方法的类型差异会在编译时进行检查。

泛型类型类或方法被声明为参数化类型。 参数化类型是具有实际类型参数的泛型类型的实例。 参数化类型使用尖括号 <> 声明。泛型主要用于集合。

泛型的优势

以下是使用泛型的关键优势

  • 类型安全: 泛型只允许保存单一类型的对象。泛型不允许存储其他对象。
  • 不需要类型转换: 不需要对对象进行类型转换。
  • 编译时检查: 泛型代码在编译时进行检查,以便避免运行时的任何问题。

让我们看看不使用泛型的问题。

在本例中,我们创建了一个具有带单个参数的主构造函数的 Person 类。现在,我们想在 Person 类的对象中传递不同类型的数据(比如 Int 类型 Person(30) 和 String 类型 Person("40"))。 Person 类的主构造函数接受 Int 类型 Person(30) 并拒绝 String 类型 Person("40")。 它会生成类型不匹配的编译时错误。

为了解决上述问题,我们使用泛型类型类,它是一个用户定义的类,接受单个类中不同类型的参数。

让我们使用泛型类型重写上面的代码。 类型为 <T> 的 Person 类是一个通用类型类,它接受 Int 和 String 类型的参数。

换句话说,类型参数 <T> 是一个占位符,将被类型参数替换。 当泛型类型被实例化时,它将被替换。

输出

30
40

在上面的例子中,当使用 Int 类型 Person<Int>(30) 和 Person<String>("40") 创建 Person 类的对象时,它分别用 Int 和 String 替换类型为 T 的 Person 类。

泛型类的语法

泛型方法的语法

Kotlin 泛型示例

让我们看一个泛型方法的例子。 在这个例子中,我们访问集合类型 (ArrayList) 的泛型方法。 为此,我们创建了两个不同的 ArrayList 类的对象:arrayListOf<String>("Ashu","Ajay") 和 arrayListOf<Float>(10.5f,5.0f,25.5f) ,分别对应 String 和 Float 类型。 当我们使用 printValue(stringList) 调用泛型方法 <T>printValue(list: ArrayList<T>) 时,方法 <T>printValue(list: ArrayList<T>) 的类型 T 将被 String 类型替换。 类似地,当我们使用 printValue(floatList) 调用泛型方法时,方法 <T>printValue(list: ArrayList<T>) 的类型 T 将被 Float 类型替换。

输出

printing the string value of stringList: Ashu
Ashu
Ajay
10.5
5.0
25.5

Kotlin 泛型扩展函数示例

由于扩展函数允许向类添加方法,而无需继承类或任何设计模式。

在本例中,我们将一个 printValue() 方法添加到泛型类型的 ArrayList 类中。 此方法分别从 String 和 Float 类型的 stringList.printValue() 和 floatList.printValue() 中调用。 由于扩展函数中的 "this" 关键字代表当前调用实例。 当我们使用 stringList.printValue() 调用扩展函数时,this 代表包含 String 类型值的 stringList 实例。 类似地,使用 floatList.printValue() 调用扩展函数时,this 代表包含 Float 类型值的 floatList 实例。

输出

Ashu
Ajay
10.5
5.0
25.5