我尝试了解Dart泛型。当我编写自己的自定义泛型类时,我理解泛型的工作原理,比如
class Class1<T> {
T func1(T para1, T para2) {
return para1 = para2;
}
}
main() {
var mycl = new Class1<int>();
print(mycl.func1(3, 5));
}
我知道,这是一个非常简单的例子,也许这没有意义,但无论如何,我知道如何使用泛型。
但是现在,我的问题是什么,看看这段代码
StreamSubscription<T> listen(Function void onData(T event), {Function onError, Function void onDone(), bool cancelOnError})
我从HttpServer API复制了它并且是listen方法。我的问题是,Dart是否支持泛型方法?我在网上搜索Dart泛型方法,但找不到它。
我真的很想了解,如何阅读Dart API文档,但有时候它很难理解。
答案 0 :(得分:5)
Dart不支持通用方法。
您在这里看到的是一种属于泛型类的方法。 T
类型变量来自类class Stream<T>
。
方法:
StreamSubscription<T> listen(Function void onData(T event), {Function onError, Function void onDone(), bool cancelOnError})
表示在Stream<int>
上,listen
方法返回StreamSubscription<int>
,并且它需要一个onData
函数,该函数需要int
个参数。
示例:
class Gift<T> {
T _content;
Gift(T content) : _content = _content;
Gift<Gift<T>> wrap() => new Gift<Gift<T>>(this);
T unwrap() => _content;
T replace(T replacement(T current)) {
var old = _content;
_content = replacement(old);
return old;
}
}
函数wrap
不是“通用的”。它根据当前对象的类型返回一个新类型。返回类型包含T
,但它与调用该方法的T
的实例相同Gift
。
函数replace
采用T -> T
类型的参数。该方法不是“通用的”,它只是一种类型,它取决于T
实例中Gift
的类型。它被称为一个。
也就是说,这些方法并不是通用的,因为每次调用它们都可以使用新的Type参数进行参数化。相反,Gift
类是通用的,Gift
的每个实例都具有type参数的值。这种实例上的方法可以在其签名中使用该类型参数,但对于一个Gift
实例,类型始终是相同的。 Gift<int>
方法将返回wrap
Gift<Gift<int>>
方法,而replace
方法需要int -> int
类型的参数。
答案 1 :(得分:0)
void main() {
returnNthElement(int index, var something){
return something[index];
}
print(returnNthElement(1, [1,2,3,4,5])); //2
print(returnNthElement(1, "HELLO"));// E
print(returnNthElement(1, 100));//NoSuchMethodError: method not found: '[]'
}
但是由于泛型类型在运行时仍然存在,您可以像这样使用它们:
void main() {
foo(List l){
if (l is List<int>) return "$l is list of ints";
if (l is List<String>) return "$l is list of Strings";
}
var li = new List<int>();
li.addAll([1,2,3,4,5]);
var ls = new List<String>();
ls.addAll(["HELLO", "DART"]);
print(foo(li)); //[1, 2, 3, 4, 5] is list of ints
print(foo(ls)); //[HELLO, DART] is list of Strings
}