如果我運行以下代碼,則會收到錯誤訊息:
import scala.reflect.ClassTag
class General {
}
class SubGeneral extends General {
def test() = println("tested")
}
class ProGeneral[T <: General: ClassTag] {
var array = Array.ofDim[T](3, 3)
def funcForSubGeneral(): Unit =
if (array(0)(0).isInstanceOf[SubGeneral]) then array(0)(0).test()
}
那是因為 General 沒有函式 test()。我知道我可以通過模式匹配來解決這個問題。這代替上面的 funcForSubGeneral() 有效:
def funcForSubGeneral(): Unit =
array(0)(0) match {
case s: SubGeneral => s.test()
case _ => println("nope")
}
但我想知道是否有可能獲得 array(0)(0) 的運行時型別并檢查它是否是 SubGeneral,如果是這種情況,那么我呼叫 test(),這應該不會引起問題嗎?這就是我通過使用 isIntanceOf 實際嘗試的。我想省略模式匹配,因為我只對一種型別感興趣。
uj5u.com熱心網友回復:
isInstanceOf不會改變任何東西,你需要做array(0)(0).asInstanceOf[SubGeneral].test()才能強制轉換。
請注意,轉換可能會在運行時失敗,所以這就是您需要檢查if之前的原因。因此最終代碼如下所示:
if (array(0)(0).isInstanceOf[SubGeneral]) then array(0)(0).asInstanceOf[SubGeneral].test()
但是,由于這既麻煩又容易出錯,我們有模式匹配:
array(0)(0) match {
case subGeneral: SubGeneral => subGeneral.test()
}
但是,請注意型式測驗被認為是一種不好的做法;主要是因為它們實際上是類檢查并且可能會在某些情況下失敗。例如:
List("a", "b", "c") match {
case numbers: List[Int] => numbers.head 1
}
將在運行時拋出例外,因為由于型別擦除,我們丟失了[String]部分,并且只有List在它嘗試將第一個元素讀取為 an時才匹配,Int這是一個錯誤。
無論如何,這是兩天內您第四次提出一個顯示不良做法和單調代碼的問題。
我的建議:
- 我敢打賭,您沒有遵循適當的資源來學習語言。相反,您似乎只是想用不同的語法模仿另一種語言(Python?)。- 因此,我鼓勵您選擇合適的書籍、課程、教程等;正確地介紹了語言及其習語。
- 我鼓勵你加入官方的Discord服務器,它比 StackOverflow 更適合新手。
- 我建議您詳細解釋您要解決的元問題(無論是在新問題中還是在Discord服務器中),我很確定有更好、更慣用的方法來解決它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395810.html
