簡體   English   中英

如何訪問定義類的隱式轉換(在Scala中)?

[英]How to access an implicit conversion defined a class (in Scala)?

我有一個像這樣的抽象類:

abstract class Base {
  val myInners = mutable.ArrayBuffer[Inner[Any]]()
  abstract class Inner[+T] {
    myInners += this
    def get: T
    // other functionality here
  }
  implicit def innerToValue[T](inner: Inner[T]) = inner.get
  class IntInner extends Inner[Int] { ... }
  class StringInner extends Inner[String] { ... }
  ...
}

最初我有一個單例對象,例如

object MyObject extends Base {
  val intVal = new IntInner()
  val stringVal = new StringInner()
  ...
}

而且我能夠在其他地方使用這些對象成員,例如functionThatExpectsAnInteger(MyObject.intVal) ,這讓我很高興:)。

但是,為了提高可測試性,我想將此object制成一個class並在使用該object任何地方注入class的實例。 但是,通過將MyObject為類,無論嘗試了什么,我似乎都無法再使用此隱式轉換,這讓我很傷心:(。

當然,這種轉換不僅節省了我在呼喚一個get方法,我可以生活離不開它,但我仍然在學習關於斯卡拉implicits,我想知道為什么,這並不工作,如果一種方法可以做到這個。

您的隱式內容有些奇怪,但是我認為這只是一個示例,因此我不打算贅述。

我之所以不這樣做,是因為如果在隨行對象的范圍內,編譯器會查找隱式對象。 如果將其轉換為類,則必須首先將其導入。 一種實現方式如下:

val obj = new MyObject()
import obj.innerToValue
val x : Int = obj.intVal

我敢肯定這可以做得更好,但只能通過整體上更改代碼的結構來完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM