簡體   English   中英

如何避免在Scala中使用asInstanceOf

[英]How to avoid using asInstanceOf in Scala

目前我的代碼需要類轉換

val dataWriter: BytesDataWriter = createDataWriter

 def createDataWriter(p: SomeClass) =
    p.create_datawriter().asInstanceOf[BytesDataWriter]

create_datawriter方法將返回超類DataWriter。 我嘗試了這種方法,而不是使用asInstanceOf進行轉換

val dataWriter: BytesDataWriter = createDataWriter(p)  match {
      case writer: BytesDataWriter => writer
      case _ => throw new ClassCastException
    }

這太冗長了,如果情況不起作用。 是否有更好的替代類鑄造?

如果您可以使用非BytesDataWriter結果執行某些 BytesDataWriter ,或者為了獲得更好的錯誤消息,您將使用第二種方法:

val dataWriter: BytesDataWriter = p.create_datawriter() match {
  case writer: BytesDataWriter => writer
  case other => throw new Exception(s"Expected p to create a BytesDataWriter, but got a ${other.getClass.getSimpleName} instead!")
}

否則,請使用asInstanceOf

Alexey Romanov的答案對於您的具體情況是一個很好的建議。 或者,您可以通過更改周圍代碼的結構來避免這種情況。

你的問題可以重新制定嗎?

當您使用類並實例化它時,看起來您正在實現某種可配置的依賴項處理。 這是一個復雜的問題,但幸運的是有一些很好的解決方案:

依賴注入

您可以使用某種依賴注入並使用專用類型注入所需的ByteDataWriter 查看Google Guice FAQ中描述的“機器人腿”示例,了解如何處理同一基類的不同變體,以及如何處理泛型 這可以幫助您避免DataWriterByteDataWriter問題。

鴨打字

您還可以使用協議訪問DataWriter (或者在Scala中使用: 結構類型 )。 在編譯時不會檢查結構類型,因此不需要類強制轉換。

蛋糕模式

或者您可以使用Scala專業處理依賴項: 蛋糕模式 有了這種模式,您可以根據需要撰寫課程。 您可以設計需要ByteDataWriter的類完全類型安全。 然后編譯器將確保它只能與正確的類組合。 不需要課堂演員。 缺點是,您無法使用配置文件重新配置依賴項。 但通常這不是必需的,因為支持的變體在編譯時是眾所周知的。

結論:盡可能嘗試重新配方

如果您有選項,請考慮使用上述方法之一重新設計代碼,以擺脫類強制轉換。 很可能您在代碼中的許多其他位置都會遇到同樣的問題。

暫無
暫無

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

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