泛型方法
本课属于 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]
}泛型方法让你能够在方法级别精细控制类型安全,让类保持简洁,同时仍能享受编译时类型检查带来的好处。
挑战
简单我们来构建一个数据转换工具,展示泛型方法的强大之处。你将创建一个 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创建一个包含重复73次的列表,并输出结果 - 使用
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
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器