2014-06-07 192 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 。謝謝 –