我有一个问题要从抽象类覆盖通用方法。
这是我的抽象类:
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/