gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:04:47 24 4
gpt4 key购买 nike

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

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.');
}

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

最佳答案

我认为这是一个很好的问题,对我来说泛型和 dynamic 之间的主要区别是:

泛型仅限于一种类型,而动态不是因为它阻止编译器执行“类型检查”。

真实例子:

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

动态使您能够使用混合映射 Map<String, dynamic> 或“模拟”联合类型逻辑,例如:
dynamic foo = //some type;
if (foo is bool) {
//do somethings
} else if (foo is String) {
//do something else
}

不使用类型的接口(interface)或继承。

那么下一个问题应该是, Objectdynamic 有什么区别?

你可以在这里找到答案: https://stackoverflow.com/a/31264980/2910520

关于generics - 在 Dart 中使用泛型与返回动态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59448392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com