泛型声明

泛型可以增加程序的灵活性,减少代码。在使用集合时经常会用到泛型:

var list = <String>[];
var set = <int>{};
var map = <String, Object>{
    'name': "abc"
};

Dart中声明泛型和Java几乎一模一样,类和方法都可以使用:

abstract class Cache<T>{
  T get(String key);
  void set(String key, T value);
}

在方法上声明并使用泛型:

T getFirst<T>(List<T> list){
    //do something
}

泛型限定

如果要求类型是某个类及其子类型的话,可以使用T extends 类名

abstract class Cache<T extends Object>{
  T get(String key);
  void set(String key, T value);
}

但Dart没有提供向上限定<T super 类名>和泛型通配符<*>,主要是因为Dart的泛型非常灵活。

在Dart中父类泛型是可以接收子类泛型的,来看个例子:

var list = <Object>[];
list = [1, 2]; 

上面的例子在Java中是不行的,在Kotlin中是可以的。可见Java的泛型是非常严格的,相比较之下,还是Dart的泛型更加人性化。

更新时间: 6/1/2019, 11:25:37 AM