2014-06-07 142 views
2

我试图理解飞镖仿制药。当我编写自己的自定义泛型类,那么我理解泛型是如何工作的,像混淆仿制药

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,是听法。我的问题是,Dart支持泛型方法吗?我在网上搜索有关Dart泛型方法的信息,但找不到它。

我真的很想明白,如何阅读Dart API文件,但有时候这很难理解。

回答

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 
} 
5

镖不支持泛型方法。

你在这里看到的是一个属于泛型类的方法。 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,但与调用该方法的Gift的实例相同,为T

功能replace需要T -> T类型的参数。该方法不是“通用的”,它只是一种类型,取决于Gift实例中它被称为“1”的类型T

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

+0

请给我看一些样品,我如何使用泛型,如StreamSubscription 。谢谢 –