关于泛型的混淆

zer*_*ing 2 generics dart

我尝试了解Dart泛型.当我编写自己的自定义泛型类时,我理解泛型如何工作,比如

class Class1<T> {

    T func1(T para1, T para2) {
        return para1 = para2;
    }
}

main() {
    var mycl = new Class1<int>();
    print(mycl.func1(3, 5));
}
Run Code Online (Sandbox Code Playgroud)

我知道,这是一个非常简单的例子,也许这没有意义,但无论如何,我知道如何使用泛型.

但是现在,我的问题是什么,看看这段代码

StreamSubscription<T> listen(Function void onData(T event), {Function onError, Function void onDone(), bool cancelOnError}) 
Run Code Online (Sandbox Code Playgroud)

我从HttpServer API复制了这个并且是listen方法.我的问题是,Dart是否支持泛型方法?我在网上搜索Dart泛型方法,但找不到它.

我真的很想了解,如何阅读Dart API文档,但有时候它很难理解.

lrn*_*lrn 5

Dart不支持通用方法.

您在这里看到的是一种属于泛型类的方法.该T类型的变量来自于类class Stream<T>.

方法:

StreamSubscription<T> listen(Function void onData(T event), {Function onError, Function void onDone(), bool cancelOnError})
Run Code Online (Sandbox Code Playgroud)

表示在a上Stream<int>,该listen方法返回一个StreamSubscription<int>,并且它需要一个onDataint参数的函数.

例:

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; 
  }
}
Run Code Online (Sandbox Code Playgroud)

该功能wrap不是"通用的".它根据当前对象的类型返回一个新类型.返回类型包含T,但它与调用方法T的实例相同Gift.

该函数replace采用类型的参数T -> T.该方法不是"通用",它只是取决于的类型的类型TGift情况下它被称为一个.

也就是说,这些方法不是通用的,因为每次调用它们都可以使用新的Type参数进行参数化.相反,Gift该类是通用的,并且每个实例都Gift具有type参数的值.这种实例上的方法可以在其签名中使用该类型参数,但是对于一个Gift实例,类型总是相同的.A Gift<int>wrap返回一个方法Gift<Gift<int>>,并且该replace方法需要一个类型的参数int -> int.