2017-05-30 58 views
1

我想通過typedef定義一個函數,然後在調用它時傳遞正確的Type。 事情是這樣的:Dart:帶泛型的typedef似乎不起作用

typedef testFn<T>(); 

main() { 
    testFn tester; 
    tester = testerFn; 
    tester<int>(); // Error: The method '() → dynamic' is declared with 0 type parameters, but 1 type arguments were given. 
} 

testerFn<T>() {//Do something} 

我不知道這是一個錯誤或沒有,但,無論如何,我怎麼我可以解決類似的東西?

回答

2

似乎與一類包裝可以解決你的情況熟悉Dart List - filter on sub type

所以,也許一個結構。

typedef testFn<T>(); 

class TestF<T> { 
    final testFn _f; 
    const TestF(final testFn this._f); 
    eval() => _f(); 
} 

testerFn<T>() { 
    print('testFn!'); 
} 

main() { 
    TestF<int> c = const TestF(testerFn); 
    c.eval(); 
} 

其實在原來的代碼,如果函數與int限定聲明它會奏效。

typedef testFn<T>(); 

main() { 
    testFn<int> tester; 
    tester = testerFn; 
    tester(); 
} 

testerFn<T>(){ 
    print('testerFn!'); 
} 
+0

謝謝喬納斯。 我做了一點修改: 'typedef testFn (T value); class TestF { final testFn _f; const TestF(final testFn this._f); eval(T value)=> _f(value); } testerFn (T value)print('testFn!$ {value.toString()}'); } main(){ TestF c = const TestF(testerFn); (9); } ' 我的目標是避免將錯誤的變量傳遞給函數的可能性。現在,如果我將代碼更改爲'c.eval('Not OK');'我得到一個錯誤。所以,你的解決方案的作品 –

+0

太好了。這個解決方案並不明顯,但我遇到了一個熟悉的問題:-) Stackoverflow有一個用於標記已解決問題的系統。在答案的左邊有複選標記,你可以標記你是否認爲它已經解決。 –

+0

喬納斯,你認爲我寫的問題是飛鏢缺陷還是我缺少什麼? –