如何从 Object 获取强类型

How to get strongly typed type from Object

我可以从 Object 中获取强类型值吗,像这样:

Object obj;
final fooOrBar = obj as (flag ? Foo : Bar); // Error

fooOrBar 应该是 FooBar 类型,但这给了我一个错误。


注:

我不想做这样的事情:

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,或者至少是 FooBar 的某些常见超类型。那么你不妨直接转换为: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);

同样,类型不会是 FooBar,而是两者的某个超类型。

如果您实际上关心 fooOrBar 的类型恰好是Foo 或恰好Bar,您需要两个不同的变量。