請考慮以下界面
interface EntityConverter<in A, out B> /span>{
fun A.convert():B
fun List<A>.convert()。List<B> = this.map { it.convert() }
}
我想在一個spring boot應用程式中使用它,其中特定的實作被注入,這樣擴展函式就可以在型別上使用了。
然而這并不奏效。編譯器并沒有解決擴展函式的問題。
uj5u.com熱心網友回復:
注意,你定義的擴展函式也是 EntityConverter型別的成員函式。您應該看看檔案的這部分內容,以了解關于如何作業的資訊。
基本上,為了使用它們,你需要在范圍內有兩個實體:
- dispatch接收器(
EntityConverter<A, B>的實體) - extension接收器(一個
A或List<A>的實體,其中A與范圍內的EntityConverter的第一個型別引數相符)
你可以使用with()來將EntityConverter帶入范圍,這樣你就可以使用通常的.語法在其他實體上使用convert:
val converter = object : EntityConverter<Int, String> {
override fun Int. convert() = "#$this"。
}
val list = listOf(1, 2, 3)
val convertedList = with( converter) {
list.convert()
}
println(convertedList) //列印 [#1, #2, #3]/span>
現在你必須決定這種使用模式是否對你的用例最有意義。如果你更喜歡沒有擴展的 "經典 "呼叫(converter.convert(a)回傳一個B),你可以將你的函式宣告為普通的方法,接受一個引數而不是一個接收器。
獎勵:功能介面
另外,如果你在你的EntityConverter介面前面添加fun關鍵字,你可以像這樣非常容易地創建它的實體:
val converter = EntityConverter< Int, String> { "#$this" }
這是因為你的轉換器介面只有一個抽象的方法,使得它很容易用一個lambda來實作。請參閱關于函式式介面的檔案。
uj5u.com熱心網友回復:
我不確定你是否可以把擴展函式作為介面的一部分來提,因為它就像靜態函式。
我建議把 "普通 "函式放在介面中,并帶有A型別的引數。然后只需在附近的串列中放入擴展方法即可。
interface EntityConverter<in A, out B> /span>{
fun convert(a: A): B
}
fun <A, B> EntityConverter<A, B>.convert(串列。List<A>)。List<B> = list.map { convert(it) }
Update
我不知道Kotlin中擴展方法的繼承可能性。還有就是它的重寫。所以我的答案可能只是使用擴展方法的一個替代方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318630.html
標籤:
上一篇:列舉的各種變體的通用實作
