Câu trả lời:
Kỹ thuật ưa thích là sử dụng khớp mẫu. Điều này cho phép bạn xử lý một cách duyên dáng trong trường hợp giá trị trong câu hỏi không thuộc loại đã cho:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Khối này sao chép ngữ nghĩa của asInstanceOf[Graphics2D]
phương thức, nhưng với tính linh hoạt cao hơn. Ví dụ: bạn có thể cung cấp các nhánh khác nhau cho các loại khác nhau, thực hiện hiệu quả nhiều phôi có điều kiện cùng một lúc. Cuối cùng, bạn không thực sự cần phải ném một ngoại lệ trong khu vực bắt tất cả, bạn cũng có thể quay lại null
(hoặc tốt nhất là None
), hoặc bạn có thể nhập một số chi nhánh dự phòng hoạt động mà không có Graphics2D
.
Nói tóm lại, đây thực sự là con đường để đi. Nó hơi cồng kềnh hơn về mặt cú pháp so với asInstanceOf
, nhưng tính linh hoạt được thêm vào hầu như luôn luôn xứng đáng.
base match { case base @ MyConcrete(value) => base.something(value) }
Rõ ràng, bóng base
là tùy chọn. Bạn có thể dễ dàng sử dụng một tên biến khác nhau.
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
, vì nó đánh bại mục đích có hệ thống kiểu tĩnh và cảm thấy xui xẻo.
scala-swing
các thành phần, tham số của paintComponent đã là Graphics2D nên không yêu cầu diễn viên