[英]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中描述的“機器人腿”示例,了解如何處理同一基類的不同變體,以及如何處理泛型 。 這可以幫助您避免DataWriter
和ByteDataWriter
問題。
您還可以使用協議訪問DataWriter
(或者在Scala中使用: 結構類型 )。 在編譯時不會檢查結構類型,因此不需要類強制轉換。
或者您可以使用Scala專業處理依賴項: 蛋糕模式 。 有了這種模式,您可以根據需要撰寫課程。 您可以設計需要ByteDataWriter
的類完全類型安全。 然后編譯器將確保它只能與正確的類組合。 不需要課堂演員。 缺點是,您無法使用配置文件重新配置依賴項。 但通常這不是必需的,因為支持的變體在編譯時是眾所周知的。
如果您有選項,請考慮使用上述方法之一重新設計代碼,以擺脫類強制轉換。 很可能您在代碼中的許多其他位置都會遇到同樣的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.