gpt4 book ai didi

generics - 使用 'is' 检查 Dart 泛型的运行时类型

转载 作者:行者123 更新时间:2023-12-04 19:27:11 25 4
gpt4 key购买 nike

我对 Dart 比较陌生,并且正在尝试对代数数据类型进行建模(例如 Swift 的具有关联值的枚举)。

但是,当我尝试检查值的运行时类型时,我看到了一些我不太了解的行为。考虑以下代码:

abstract class Fetchable<T> {
factory Fetchable.success(T object) = FetchableSuccess;
factory Fetchable.error(Error error) = FetchableError;
}
class FetchableSuccess<T> implements Fetchable<T> {
final T object;
const FetchableSuccess(this.object);
}
class FetchableError<T> implements Fetchable<T> {
final Error error;
const FetchableError(this.error);
}

void main() {
// ------------- CASE 1 -------------
final s = Fetchable.success("hi there");
print(s.runtimeType); // FetchableSuccess<dynamic>
print(s is FetchableSuccess); // true
print(s is FetchableSuccess<String>); // false
print(s is FetchableSuccess<dynamic>); // true

if (s is FetchableSuccess) {
print(s.object); // compile error
}
if (s is FetchableSuccess<dynamic>) {
print(s.object); // compile error
}

// ------------- CASE 2 -------------
final e = Fetchable.error(StateError("uh oh"));
print(e is FetchableError); // true
if (e is FetchableError) {
print(e.error); // Works OK
}
}

如您所见,我创建了两个案例...我似乎无法提取 object来自 success 的变量案子。 is关键字告诉我它是 FetchableSuccess<dynamic> (这看起来很奇怪......我认为 Dart 不会删除类型?我原以为它是 FetchableSuccess<String> )

即便如此,如果我转换为 FetchableSuccess<dynamic>编译器仍然告诉我它不知道 object FetchableSuccess 中的变量子类。

相比之下, FetchableError (它没有明确使用 T 类型的值)... is工作正常,编译器能够访问 error多变的。

我错过了什么?任何指导将不胜感激。

最佳答案

我们这里有几个问题:首先,您需要添加 <T>在两个工厂构造函数的右侧。

如果你这样做,s 的运行时类型将是 ReflectableSucces<String>应该是这样,你会得到true来自 main 中的以下 3 行.

然后你正在测试 s is FetchableSuccess这意味着 s is FetchableSuccess<dynamic> , 这不是静态已知类型 Fetchable<String> 的子类型所以你不会得到提升(所以静态类型中没有 object getter,因此出现错误)。测试 s is FetchableSucces<dynamic>明确的当然要受到同样的待遇。

所以剩下的问题是,为什么你没有得到那些丢失的错误 <T>年代?我现在正在寻找问题,这可能是一个已知的错误。

更新:https://github.com/dart-lang/sdk/issues/34714解决了即使应该在公共(public)前端也没有进行推理的事实。所以我们使用来自分析器的推理得到分析,然后我们在运行时得到不使用推理的语义(因此默认为 <dynamic> ),这就是我们在实际类型参数中得到这种不幸冲突的原因在运行时是错误的,并且没有编译时错误。当上述问题出现时,它应该得到解决。

关于generics - 使用 'is' 检查 Dart 泛型的运行时类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52674849/

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