Diberikan variabel dengan tipe Graphics
, bagaimana cara saya melemparkannya ke Graphics2D
dalam Scala?
Teknik yang disukai adalah menggunakan pencocokan pola. Ini memungkinkan Anda menangani kasus dengan anggun bahwa nilai yang dimaksud bukan dari jenis yang diberikan:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Blok ini mereplikasi semantik dari asInstanceOf[Graphics2D]
metode ini, tetapi dengan fleksibilitas yang lebih besar. Misalnya, Anda dapat memberikan cabang yang berbeda untuk berbagai jenis, secara efektif melakukan gips bersyarat pada saat yang sama. Akhirnya, Anda tidak benar - benar perlu melemparkan pengecualian di area tangkap semua, Anda juga bisa kembali null
(atau lebih disukai, None
), atau Anda bisa memasukkan beberapa cabang mundur yang bekerja tanpa Graphics2D
.
Singkatnya, ini benar-benar cara untuk pergi. Ini sedikit lebih sintaksis daripada asInstanceOf
, tetapi fleksibilitas tambahan hampir selalu sepadan.
base match { case base @ MyConcrete(value) => base.something(value) }
Jelas, membayangbase
adalah opsional. Anda bisa dengan mudah menggunakan nama variabel yang berbeda.val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
sumber
asInstanceOf
, karena itu mengalahkan tujuan memiliki sistem tipe statis dan terasa menjijikkan.scala-swing
komponen, parameter paintComponent sudah Graphics2D jadi tidak diperlukan pemeran