如何从 Object 获取强类型
How to get strongly typed type from Object
我可以从 Object
中获取强类型值吗,像这样:
Object obj;
final fooOrBar = obj as (flag ? Foo : Bar); // Error
fooOrBar
应该是 Foo
或 Bar
类型,但这给了我一个错误。
注:
我不想做这样的事情:
if (flag) {
final foo = obj as Foo;
} else {
final bar = obj as Bar;
}
你做不到你要求的。
一个变量只有一种类型,由 compile-time 确定。
由于 flag
在 compile-time 处未知,因此它不能影响变量 fooOrBar
.
的类型
你也不能像那样对类型进行抽象。 as
后面的东西必须是单一类型。
你可以做到
var fooOrBar = flag ? obj as Foo : obj as Bar;
但是 fooOrBar
的静态类型无论如何都可能是 Object
,或者至少是 Foo
和 Bar
的某些常见超类型。那么你不妨直接转换为:var castObj = obj as CommonSupertypeOfFooAndBar;
.
您可以使用辅助函数:
Foo asFoo(Object o) => o as Foo;
Bar asBar(Object o) => o as Bar;
//...
var fooOrBar = (flag ? asFoo : asBar)(obj);
同样,类型不会是 Foo
或 Bar
,而是两者的某个超类型。
如果您实际上关心 fooOrBar
的类型恰好是Foo
或恰好Bar
,您需要两个不同的变量。
我可以从 Object
中获取强类型值吗,像这样:
Object obj;
final fooOrBar = obj as (flag ? Foo : Bar); // Error
fooOrBar
应该是 Foo
或 Bar
类型,但这给了我一个错误。
注:
我不想做这样的事情:
if (flag) {
final foo = obj as Foo;
} else {
final bar = obj as Bar;
}
你做不到你要求的。
一个变量只有一种类型,由 compile-time 确定。
由于 flag
在 compile-time 处未知,因此它不能影响变量 fooOrBar
.
你也不能像那样对类型进行抽象。 as
后面的东西必须是单一类型。
你可以做到
var fooOrBar = flag ? obj as Foo : obj as Bar;
但是 fooOrBar
的静态类型无论如何都可能是 Object
,或者至少是 Foo
和 Bar
的某些常见超类型。那么你不妨直接转换为:var castObj = obj as CommonSupertypeOfFooAndBar;
.
您可以使用辅助函数:
Foo asFoo(Object o) => o as Foo;
Bar asBar(Object o) => o as Bar;
//...
var fooOrBar = (flag ? asFoo : asBar)(obj);
同样,类型不会是 Foo
或 Bar
,而是两者的某个超类型。
如果您实际上关心 fooOrBar
的类型恰好是Foo
或恰好Bar
,您需要两个不同的变量。