[英]How to force a compile time function's argument to be of a specific type in Scala?
當我們僅知道對象類型為Any
時,是否有一種方法可以強制將函數參數的編譯類型設置為函數簽名中定義的期望類型? 讓我用一個簡單的例子演示它。
鑒於我們已經定義了以下三個功能:
def writeInt(value: Int): Unit { ... }
def writeString(value: String): Unit { ... }
def get(name: String): Any = { ... }
我如何才能讓下面的代碼編譯成功不強迫程序員參考writeInt
功能在他的計划,明確規定什么get
的回報應該用.asInstanceOf[Int]
writeInt(get("dividend").asInstanceOf[Int]) // this works...
writeInt(get("dividend")) // but this does not :(
由於get
可能返回Any
對象,該對象可能是一個Int
以及一個String
,是否有一種優雅的方法可以在Scala中解決它,而沒有難看的.asInstanceOf[Int]
表示法?
請注意,在程序的其他部分,我希望能夠使用相同的函數分別編寫此代碼,而無需再次鍵入.asInstanceOf[String]
:
writeString(get("name").asInstanceOf[String]) // this works...
writeString(get("name")) // but this does not :(
本質上,我知道get("dividend")
返回一個Int
而get("name")
返回一個String
。 但是,如何讓編譯器知道它卻又沒有太多混亂呢?
您可能會為您的write
方法使用一個包裝器。
def writeAny(a: Any): Unit = a match {
case s: String => writeString(s)
case i: Int => writeInt(i)
}
更好的解決方案是讓您的get()
方法返回Either[String,Int]
。 然后您的代碼可以執行以下操作:
get(str).fold(writeString, writeInt)
通常,應盡可能避免使用Any
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.