我正在尝试在Dart中使用泛型方法(1.22.0-dev.10.3)。这是一个简单的例子:
abstract class VR<T> {
VR();
bool foo<T>(T value);
}
class VRInt extends VR<int> {
VRInt();
bool foo<int>(int n) => n > 0; // Thinks n is Object
}
class VRString extends VR<String> {
VRString();
bool foo<String>(String s) => s.length > 0; // Thinks s is Object
}
两个子类都会产生错误,表明foo
的参数是一个Object。
我确信这只是我的一个语法错误,但我搜索了文档并找不到答案。
答案 0 :(得分:3)
通用方法的类型参数与其类参数类型没有直接关系。
您可以在没有泛型的类上使用泛型方法:
class MyClass {
T add<T>(T f()) => f();
}
您还可以在具有泛型的类上使用泛型方法:
class MyClass<A> {
A aInstance;
// here <T> is needed because unrelated to <A>
T add<T>(T f(A a)) => f(aInstance);
}
在您的情况下,您不需要方法的类型参数:
abstract class VR<T> {
VR();
bool foo(T value);
}
class VRInt extends VR<int> {
VRInt();
bool foo(int n) => n > 0; // Thinks n is Object
}
class VRString extends VR<String> {
VRString();
bool foo(String s) => s.length > 0; // Thinks s is Object
}
但这里不需要通用方法的概念。
答案 1 :(得分:2)
在引入泛型方法之前,您正在做的事情已经完成,因为您只是使用类的泛型类型参数。 为此,只需删除方法上的类型参数即可解决问题。
通用方法是允许传递专门没有调用站点
的方法的类型class MyClass {
T myMethod<T>(T param) {
console.log(param);
}
}
然后像
一样使用它new MyClass().myMethod<List<String>>(['a', 'b', 'c']);