flutter - Dart:不重写泛型方法具有与返回类型相似的泛型参数类型

标签 flutter dart generic-method

我有一个问题要从抽象类覆盖通用方法。

这是我的抽象类:

abstract class A {
  String getData<Type>(Type key);
}

当我创建一个类(B)来实现类(A)时,如下所示:
class B implements A {
  @override
  String getData<String>(String key) {     //Error <= B.getData' ('String Function<String>(String)') isn't a valid override of 'A.getData' ('String Function<Type>(Type)')

    return "";
  }
}

在(getData)方法中显示以下编译错误:

'B.getData' ('String Function(String)') isn't a valid override of 'A.getData' ('String Function(Type)'). dart(invalid_override)



并在return语句中出现此错误:

A value of type 'String can't be returned from method 'getData' because it has a return type of 'String'.



当通用类型类似于返回类型时,为什么我会得到与覆盖相关的错误,这使我感到困惑。当我用getData<int>(int key)而不是getData<String>(String key)创建另一个类(C)时,一切正常
class C implements A {
  @override
  String getData<int>(int key) {

    return "";
  }
}

同样,对于类(class)(B),如果我删除了如下所示的返回类型,那么一切都会按预期进行:
class B implements A {

  @override
  getData<String>(String key) {

     return "";
  }
}

这是Dart设计中的问题,因此我可以意识到,因为这种行为例如在C#语言中不存在?

DartPad链接:
https://dartpad.dev/ebc7e6361d0cf1c6afad2f52ab8ebcaa

最佳答案

您编写的第一个方法是对名为Type的类型参数的泛型,并且具有返回类型String。也就是说,对于任何Type类型,该函数都会返回String类型的东西。

第二种方法是对名为String的类型参数的泛型,并返回该类型参数类型的内容。类型参数名为 String的事实使您看起来在第一种方法和第二种方法中具有相同的返回类型,但没有。第一种方法返回String。第二种方法的返回类型为“刚引入的类型变量,名称为String”。这两种类型无关,因此覆盖无效。如果将第二种方法中的类型变量重命名为T,则会得到以下等效方法:

class B implements A {
  @override
  T getData<T>(T key) {
    return "";
  }
}

现在应该清楚为什么您的覆盖无效。

关于flutter - Dart:不重写泛型方法具有与返回类型相似的泛型参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61022367/

相关文章:

scala泛型方法覆盖

scala - 如何在 Scala 中将泛型方法包装在泛型方法周围?

点击菜单图标时 flutter 抽屉

dart - 为什么从其他文件访问时 Flutter GlobalKey 的 currentState 为 NULL

flutter - Flutter Side Navigation Bar小部件

android - Flutter应用启动时的"Invalid argument false with type bool."

flutter - flutter 中的自动扩展容器——适用于所有设备

user-interface - 如何在 flutter 中对齐TabBar的元素?

json - 列表中的列表JSON解析在 flutter

java - 通用方法不起作用