簡體   English   中英

如何在Scala中強制編譯時間函數的參數為​​特定類型?

[英]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")返回一個Intget("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.

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