Menu
CoddyTech

泛型方法

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 66 课,共 110 课。

类可以是泛型的,单个方法也可以有自己的类型参数。当你需要灵活的方法,但不想让整个类都变成泛型时,这种方式很有用。

泛型方法会在返回类型前声明类型参数:

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // hello
}

Dart 通常可以根据参数推断类型,所以你不必总是显式指定类型:

var result = findFirst([10, 20, 30]);  // Dart 推断出 int 类型

当类中只有某些操作需要类型灵活性时,泛型方法特别有用:

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // 类型推断为 int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

泛型方法让你能够在方法级别精细控制类型安全,让类保持简洁,同时仍能享受编译时类型检查带来的好处。

challenge icon

挑战

简单

我们来构建一个数据转换工具,展示泛型方法的强大之处。你将创建一个 Transformer 类,其中的方法可以处理任意类型,让你拥有更大的灵活性,同时不必让整个类都成为泛型类。

你将把代码分成两个文件:

  • transformer.dart:创建一个 Transformer 类,并添加以下泛型方法:
    • T getFirst<T>(List<T> items):返回列表中的第一个元素
    • T getLast<T>(List<T> items):返回列表中的最后一个元素
    • List<T> repeat<T>(T item, int times):创建一个列表,其中包含指定次数的重复元素
    • void printPair<A, B>(A first, B second):按照 Pair: [first] and [second] 的格式输出两个值
  • main.dart:导入 transformer 文件,并使用不同类型演示每个泛型方法:
    • 创建一个 Transformer 实例
    • 对 [10, 20, 30] 使用 getFirst,并输出结果
    • 对 ['apple', 'banana', 'cherry'] 使用 getFirst,并输出结果
    • 对 [1.5, 2.5, 3.5] 使用 getLast,并输出结果
    • 使用 repeat 创建一个包含重复 'Hi' 4 次的列表,并输出结果
    • 使用 repeat 创建一个包含重复 7 3 次的列表,并输出结果
    • 使用 printPair,参数为 'Name' 和 42
    • 使用 printPair,参数为 100 和 true

注意,每个方法都声明了自己的类型参数,因此同一个 Transformer 对象可以处理整数、字符串、双精度浮点数和布尔值,同时确保类型安全。printPair 方法展示了如何在单个方法中使用两个类型参数。

预期输出:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

亲手试试

import 'transformer.dart';

void main() {
  // 创建一个 Transformer 实例
  var transformer = Transformer();

  // TODO:对 [10, 20, 30] 使用 getFirst,并打印结果

  // TODO:对 ['apple', 'banana', 'cherry'] 使用 getFirst,并打印结果

  // TODO:对 [1.5, 2.5, 3.5] 使用 getLast,并打印结果

  // TODO:使用 repeat 创建一个包含重复 4 次的 'Hi' 的列表,并打印它

  // TODO:使用 repeat 创建一个包含重复 3 次的 7 的列表,并打印它

  // TODO:使用 printPair,传入 'Name' 和 42

  // TODO:使用 printPair,传入 100 和 true
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器