Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 在Dart中使用泛型与返回动态_Generics_Dart_Dynamic - Fatal编程技术网

Generics 在Dart中使用泛型与返回动态

Generics 在Dart中使用泛型与返回动态,generics,dart,dynamic,Generics,Dart,Dynamic,我有一个抽象类,它为用户存储不同的设置,因此我可以从同一位置引用它们。然后,每当我需要查看他们的设置时,我调用一个函数,将设置的名称(字符串)映射到设置的值。例如: abstract class UserPrefs { static bool auto_create; static String favorite_location; // etc } 然后我有一个函数(也在UserPrefs中)来获取相关值,如下所示: static dynamic getSettingFrom

我有一个抽象类,它为用户存储不同的设置,因此我可以从同一位置引用它们。然后,每当我需要查看他们的设置时,我调用一个函数,将设置的名称(字符串)映射到设置的值。例如:

abstract class UserPrefs {

  static bool auto_create;
  static String favorite_location;
  // etc

}
然后我有一个函数(也在
UserPrefs
中)来获取相关值,如下所示:

static dynamic getSettingFromString(String name) {
  switch (name) {
    case 'auto_create': return auto_create;
    case 'favorite_location': return favorite_location;
    // etc
  }
  throw UserPrefNotFound('User preference "$name" does not exist.');
}
这很好,但这也很好:

static T getSettingFromString<T>(String name) {
  switch (name) {
    case 'auto_create': return auto_create as T;
    case 'favorite_location': return favorite_location as T;
    // etc
  }
  throw UserPrefNotFound('User preference "$name" does not exist.');
}
static T getSettingFromString(字符串名称){
交换机(名称){
案例“auto_create”:返回auto_create作为T;
案例“收藏夹位置”:将收藏夹位置返回为T;
//等
}
throw UserPrefNotFound('用户首选项“$name”不存在');
}

我想知道两者的潜在优势是什么(在速度、效率等方面),最终的区别是什么。基本上,为什么一个(或一个)比另一个好,使用其中一个会产生我不知道的不可预见的后果。谢谢

我认为这是一个好问题,泛型和
动态
之间的主要区别在于:

泛型仅限于1种类型,而动态则不是,因为它会停止编译器执行“类型检查”

实例:

class Foo<T> {
  var bar = List<T>();
  var foo = List<dynamic>();

  void addBar(T elem) {
    bar.add(elem);
  }

  void addFoo(dynamic elem) {
    foo.add(elem);
  }
}

var bar = Foo<String>()
  ..addBar("hello")
  ..addBar(123); //compile error, you can't add an integer to <string> list

var foo = Foo<String>()
  ..addFoo("hello")
  ..addFoo(123); //OK because dynamic accept any type
不使用接口或类型继承

所以下一个问题应该是,
对象
动态
之间有什么区别

你可以在这里找到答案:

dynamic foo = //some type;
if (foo is bool) {
  //do somethings
} else if (foo is String) {
  //do something else
}