关于泛型的混淆

时间:2014-06-07 20:14:17

标签: 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));
}

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

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

StreamSubscription<T> listen(Function void onData(T event), {Function onError, Function void onDone(), bool cancelOnError}) 

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

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

2 个答案:

答案 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)

达特并不真的需要他们。类型是可选的,您可以删除它们并使用&#34; duck typing&#34;。

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
}