在Dart中,无法使用int调用(int)=> String类型的函数

马塞尔

我有以下代码:

typedef Eater<T> = String Function(T value);

Eater<T> eaterFor<T>(T value) {
  // Find an appropriate eater.
  if (value is int) {
    return ((int value) => 'Eating int $value.') as Eater<T>;
  } else if (value is String) {
    return ((String value) => 'Eating String $value.') as Eater<T>;
  }
  throw 'No eater found for $value.';
}

extension on Object? {
  void eat() {
    final eater = eaterFor(this);
    print(eater(this)); // This fails.
  }
}

void main() => 4.eat();

我希望可以打印出来Eating int 4.,但是print带有以下消息的行失败(在DartPad上,可能在VM上略有不同):

Closure 'eaterFor_closure': type '(int) => String' is not a subtype of type '(Object?) => String'

显然,类型的封闭(int) => String不能与所谓的this,它的类型的int我认为这应该可以以某种方式起作用,但是很明显,我关于Dart工作方式的思维模型与编译器不匹配。

我在这里想念什么?我们有一个闭包和一个与其输入变量类型匹配的值。我知道有很多强制转换和可能不是完全类型安全的部分,但是我们应该能够使用值调用闭包,不是吗?

到目前为止,这是我的尝试,但没有成功:

  • 投放eaterString Function(dynamic value)
  • 保存this到一个临时变量

为什么会引发错误?我该如何称呼eaterwith this

julemand101

泛型和扩展名由编译器静态确定,而不由运行时确定。您的问题是以下内容:

extension on Object? {
  void eat() {
    final eater = eaterFor(this);
    print(eater(this)); // This fails.
  }
}

实际上被编译为以下内容:

extension on Object? {
  void eat() {
    final eater = eaterFor<Object?>(this);
    print(eater(this)); // This fails.
  }
}

Object?如果类型T在运行时更精确,则编译器只能猜测类型T必须是事件。结果是您得到:

Eater<Object?> eaterFor(Object? value) {
  // Find an appropriate eater.
  if (value is int) {
    return ((int value) => 'Eating int $value.') as Eater<Object?>;
  } else if (value is String) {
    return ((String value) => 'Eating String $value.') as Eater<Object?>;
  }
  throw 'No eater found for $value.';
}

这不是真的有效,因为:

String Function(Object? value);

可以接受更多类型的值作为输入int因此您的转换失败,因为((int value) => 'Eating int $value.')不能转换为String Function(Object? value)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Dart中的'int'类型不是'String'类型的子类型错误

无法调用非函数类型'String'的值

无法对原始类型 int 调用 contains(int)

无法使用类型为“(Int?)”的参数列表调用类型“String”的初始值设定项

快速轮回功能。无法调用非函数类型“ Int”的值

Dart中的Function <String,int>?

无法在数组类型int [] []上调用splice(int,int)

无法在原始类型int上调用equals(String)

无法对数组类型 String[] 调用 charAt(int)

无法在函数调用中使用int后减

Flutter/Dart:类型“int”不是类型转换中“String”类型的子类型

Scala String *类型(在args函数中)

无法使用类型为“(Int,Int)”的参数列表调用“swapAt”

Swift无法使用类型为((Int,Int)'的参数列表调用'*'

无法在原始类型int上调用toString()

无法在原始类型int上调用nextint()

无法在原始类型int上调用findViewById(int)

使用pthread_create调用类型为“ int argc,char ** argv-> int”的C函数。

Dart - 类型“List<int>”不是“函数结果”的“List<List<int>>”类型的子类型

如何在类/类型中向 buildt 添加更多函数,如 int、double、std::string 等

无法使用类型为“(Int32?)”的参数列表调用类型“UnsafeMutablePointer<Int32>”的初始化程序

错误:被调用的对象类型'int'不是函数或函数指针

被调用的对象类型“int”不是函数或函数指针

如何在 Java 中对数组类型 String[] 调用 substring(int, int)

为什么在使用CHAR类型的参数调用时构造函数选择INT类型而不是SHORT?

得到此错误“无法在数组类型String []上调用set(int,String)”

无法使用类型为“([Int])”的参数列表调用类型“Double”的初始化程序

无法使用类型为JSON的参数列表调用类型为'Int'的初始化程序

函数类型中的方法replace(String,String,String)不适用于参数(StringBuffer,String,String)