📜  Dart – 泛型(1)

📅  最后修改于: 2023-12-03 15:14:36.331000             🧑  作者: Mango

Dart – 泛型

在编程中,泛型是指编写代码时不指定特定类型,而是使用类型参数来标识类型,该特性可以让代码更加灵活并且可重用。Dart语言也支持泛型。

泛型的基本定义

在Dart中,可以使用<>操作符来定义泛型,例如:

List<String> names = ['John', 'Mike', 'Peter'];

上面的代码定义了一个List类型的变量names,它只能包含字符串类型的元素。这是因为泛型List的类型参数是String。

泛型的类型推断

Dart语言具有类型推断的能力,这使得我们无需在泛型中显式指定类型参数。例如:

var names = ['John', 'Mike', 'Peter'];

上面的代码定义了一个变量names,List类型推断为String。这是因为Dart可以根据元素推断出它们的类型。

泛型函数

泛型不仅可以应用于类和接口,还可以应用于函数。下面是一个泛型函数的示例:

T getValue<T>(T value) {
  return value;
}

上面的代码定义了一个函数getValue,它使用泛型类型参数T。该函数接受一个值并返回它,不管该值是什么类型。调用getValue函数的示例如下:

int intValue = 5;
String strValue = 'hello';
print(getValue<int>(intValue)); // 5
print(getValue<String>(strValue)); // hello

在上面的示例中,我们在调用getValue函数时使用了类型参数。该函数会返回与类型参数相同类型的值。

泛型约束

有时我们需要指定泛型类型参数必须实现特定的接口或继承特定的类。我们可以使用extends关键字来指定泛型类型参数的约束条件。下面是一个使用泛型约束的示例:

class Pair<K extends num, V> {
  K key;
  V value;

  Pair(this.key, this.value);
}

void main() {
  Pair<int, String> pair1 = Pair(1, 'apple');
  Pair<double, String> pair2 = Pair(3.14, 'pi');

  print(pair1.key); // 1
  print(pair2.key); // 3.14
}

上面的示例定义了一个Pair类,它有两个类型参数K和V。K类型参数必须是num或其子类,V可以是任意类型。我们使用泛型约束来实现这个限制。

泛型的优点

泛型的应用可以让我们编写更加通用的代码,它可以帮助我们消除冗余的代码并提高代码复用性。泛型还可以让代码更加类型安全,减少潜在的运行时错误。

结论

Dart语言中的泛型是一项非常有用的功能,它可以让我们编写更加通用和易于重用的代码。通过本文的介绍,你可以了解到泛型在Dart中的基本使用方式和一些具体的应用,希望能够对你有所帮助。