在為我們的型別實作型別類時,我們可以使用不同的語法(例如animplicit val或 an implicit object)。舉個例子:
型別類定義:
trait Increment[A] {
def increment(value: A): A
}
而且,據我所知,我們可以Int通過以下兩種方式實作它:
implicit val fooInstance: Increment[Int] = new Increment[Int] {
override def increment(value: Int): Int = value 1
}
// or
implicit object fooInstance extends Increment[Int] {
override def increment(value: Int): Int = value 1
}
對于 Scala 2.13,我總是使用第一個,它的縮寫語法如下所示:
implicit val fooInstance: Increment[Int] = (value: Int) => value 1
但是,它們之間有什么真正的區別嗎?或者是否有任何建議或標準可以做到這一點?
有一個關于轉換的隱式定義和隱式類的相關問題,但我更多的是關于如何創建型別類的(最佳實踐)實體,而不是關于隱式轉換
uj5u.com熱心網友回復:
據我所知,差異是:
objects 有不同的初始化規則——它們通常會被延遲初始化(如果你不在建構式中執行副作用也沒有關系)- 它也會與 Java 不同(但同樣,您可能不會注意到 Scala 中的差異)
object X將有一個型別X.type,它是任何X擴展或實作的子型別(但隱式決議會發現它擴展了你的型別類,盡管可能需要更多的努力)
所以,我看不出實際使用有任何差異,但該implicit val版本可以生成更少的 JVM 垃圾(我說垃圾是因為在這種特殊情況下你不會使用任何額外的編譯器作業)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366268.html
上一篇:Scala選項和一些不匹配
下一篇:Scala3中的遞回高階函式型別
