Flutter 省道:不';t override泛型方法具有与返回类型类似的泛型参数类型

Flutter 省道:不';t override泛型方法具有与返回类型类似的泛型参数类型,flutter,dart,generic-method,Flutter,Dart,Generic Method,我遇到了一个从抽象类重写泛型方法的问题 这是我的抽象类: abstract class A { String getData<Type>(Type key); } 抽象类A{ 字符串getData(类型键); } 当我创建一个类(B)来实现类(a)时,如下所示: class B implements A { @override String getData<String>(String key) { //Error <= B.getData'

我遇到了一个从抽象类重写泛型方法的问题

这是我的抽象类:

abstract class A {
  String getData<Type>(Type key);
}
抽象类A{
字符串getData(类型键);
}
当我创建一个类(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 "";
  }
}
B类实现了{
@凌驾

String getData(String key){//Error您编写的第一个方法是名为
type
的类型参数上的泛型方法,具有返回类型
String
。也就是说,对于任何类型
type
它都是返回类型
String
的函数

第二个方法是名为
String
的类型参数的泛型,并返回类型参数类型的某些内容。类型参数名为
String
这一事实使第一个方法和第二个方法中的返回类型看起来相同,但实际情况并非如此。第一个方法的返回类型为
String
。第二个方法的返回类型为“刚刚引入的类型变量,其名称为
String
”。这两种类型不相关,因此重写无效。如果将第二个方法中的类型变量重命名为
T
,则会得到以下等效方法:

class B implements A {
  @override
  T getData<T>(T key) {
    return "";
  }
}
B类实现了{
@凌驾
T获取数据(T键){
返回“”;
}
}
现在应该清楚为什么覆盖无效。

方法签名

String getData<Type>(Type key);
此签名用于允许为
T
填写任何类型的方法。这意味着每个子类必须有一个允许任何类型
T
的方法

我怀疑您想要的是将子类专门化为单个泛型类型——在这种情况下,您希望将泛型从方法级别移动到类级别

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

class B implements A<String> {
  @override
  String getData(String key) => '';
}

class C implements A<int> {
  @override
  String getData(int key) => '';
}
抽象类A{
字符串getData(T键);
}
类B实现了一个{
@凌驾
字符串getData(字符串键)=>“”;
}
类C实现了一个{
@凌驾
字符串getData(int键)=>“”;
}

这是一个非常有趣的问题。我强烈建议您在GitHub上的dart lang存储库中分享这一点:您能用DartPad完整的代码更新这个问题吗?就像这里显示的一样:感谢您的回复,即使我将“Type”更改为“T”,我也会附加一个带有代码的DartPad链接,我会得到相同的错误。谢谢,现在有意义了。谢谢你的回复,我附加了一个带有代码的DartPad链接,我不想将泛型从方法级移动到类级。我的问题是,我怀疑Dart的设计中有错误,覆盖了具有相同返回类型的泛型方法。我尝试了你的解决方案,我有另一个,我稍后会记录下来,看Leaf的答案。当你写
String getData(String key)
时,它与写
T getData(T key)
是一样的。你不能有“String”表示返回类型中的类型
String
和泛型类型参数
String
。使用
作为泛型类型参数是非常不寻常的。几乎可以肯定的是,您不想创建一个具有非常常见类型名称的泛型参数,如果您想返回该类型,则无法执行此操作rkaround是
导入'dart:core'作为核心;
core.String getData(String key)
。另请参见@Nata Bosch,我可以用您提到的解决方法解决它,Leaf的答案现在对我来说很有意义
String getData<Type>(Type key);
String getData<T>(T key);
abstract class A<T> {
  String getData(T key);
}

class B implements A<String> {
  @override
  String getData(String key) => '';
}

class C implements A<int> {
  @override
  String getData(int key) => '';
}