2011-04-15 47 views
9

我想更清楚地瞭解我的關於他們的參數類型的閉包。所以,我喜歡寫東西Groovy中輸入參數的關閉

List<Y> myCollect(List<X> list, Closure<X,Y> clos) { ... } 

我知道,Groovy中不會使用該類型的信息,但Groovy的++可以在編譯時使用它。這可以實現(除了將其納入評論)?

更新: 標題可能聽起來有誤導性,但我認爲上面的例子會使它更清晰。我有興趣指定一個閉包的類型,它是一些函數的參數。假設,我想重新定義內置的collect。所以我有興趣寫myCollect,而不是寫在clos。我想實現的是編譯時錯誤

myCollect(['a', 'ab'], { it/2 }) // compile error 
myCollect(['a', 'ab'], { it.size() }) // OK 
+1

在類型Closure 中,V表示閉包的返回值,而不是其參數。因此,由於無法返回兩個值,因此設置Closure 是沒有意義的。 – 2013-07-26 01:16:09

+0

我的意思是'Closure '接受一個'X'作爲輸入並返回'Y'。所以它可以應用於'List '的項目。我更新了函數的返回類型。 – 2013-07-26 08:57:44

回答

6

您可以定義閉包參數的類型,但上面顯示的語法不正確。這裏是不帶參數類型的閉包:

def concatenate = {arg1, arg2 -> 
    return arg1 + arg2 
} 

這裏是一樣的封閉與參數類型

def concatenate = {String arg1, String arg2 -> 
    return arg1 + arg2 
} 

我知道,Groovy中不會使用該類型的信息,但Groovy的++可以使用它在編譯時。

Groovy確實做了一些編譯時類型檢查,但沒有Groovy ++(或Java)那麼多。即使在編譯時不使用類型信息,它也會在運行時檢查,並且作爲文檔形式也很有價值。

+0

請看我的更新。你的'concatenate'是什麼類型?它是'Closure '?或者是什麼? – 2011-04-18 17:07:09

+0

我接受這個答案並不是因爲我很滿意,但這是唯一的一個:(也許,我的問題不夠清楚。 – 2011-07-22 10:35:05

0

我認爲你不再使用Groovy ++,但即使你是這樣也可能工作。這當然適用於靜態類型的Groovy 2.x的

interface Z { 
    void callback(X x, Y y) 
} 

List<Y> myCollect(List<X> list, Z clos) { 
    ... 

    clos.callback(x, y) 
} 

來電,然後與正常調用它:

List<Y> object.myConnect(list) { X x, Y y -> 
} 

如果你離開一個參數並有@CompileStatic,編譯器拿起失蹤PARAMS或不好的類型。

這是可行的,因爲1方法接口相當於Groovy中的閉包。