【问题标题】:Capture a generic runtime type of an object in a function在函数中捕获对象的通用运行时类型
【发布时间】:2021-03-26 20:43:10
【问题描述】:

考虑以下最小示例:

class Element<T> {}

final elements = [
  Element<String>(),
  Element<int>(),
];

Element<T> transformation<T>(Element<T> element) => Element<T>();

void main() {
  // prints 'Element<String>', 'Element<int>'
  for (final element in elements) {
    print(element);
  }

  // prints 'Element<Object>', 'Element<Object>',
  // but I would like to get identical output as above.
  for (final element in elements) {
    print(transformation(element));
  }
}

我不知道如何使用其各自的通用运行时类型 T 而不是 elements 集合的静态 Object 类型来创建每个 Element&lt;T&gt; 的转换。

我记得过去曾见过一些复杂的嵌套闭包技巧,但现在似乎找不到了。如何让我的函数捕获T 的运行时类型,而不必在Element 类本身中实现转换函数?

【问题讨论】:

  • 我不认为你可以。 elements的静态类型必然是Element&lt;Object&gt;,泛型类型参数也是静态解析的,所以transformation()会是transformation&lt;Object&gt;()

标签: dart


【解决方案1】:

这是不可能的。 访问对象类型变量的唯一方法是对象将其提供给您。 如果Element 有这样的方法

  R callWith<R>(R Function<T>(Element<T>) action) => action<E>(this);

然后您可以访问Element&lt;E&gt;E 作为类型变量。 你不能在课堂外这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多