2009-05-31 22 views

Trả lời

276

Kỹ thuật ưu tiên là sử dụng đối sánh mẫu. Điều này cho phép bạn một cách duyên dáng xử lý các trường hợp đó giá trị trong câu hỏi là không của loại nhất định:

g match { 
    case g2: Graphics2D => g2 
    case _ => throw new ClassCastException 
} 

khối này phản ánh những ngữ nghĩa của phương pháp asInstanceOf[Graphics2D], nhưng với sự linh hoạt hơn. Ví dụ, bạn có thể cung cấp các nhánh khác nhau cho các kiểu 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 cần thực sự cần phải ném ngoại lệ vào khu vực bắt, bạn cũng có thể trả lại null (hoặc tốt hơn 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ần Graphics2D.

Tóm lại, đây thực sự là cách để đi. Hơi phức tạp hơn một chút so với asInstanceOf, nhưng tính linh hoạt bổ sung hầu như luôn đáng giá.

+19

+1 bởi vì nó thú vị, nhưng hơi quá nhiều cho kịch bản này phải không? –

+0

nếu tôi đã được patternmatched nhưng bị mất tham chiếu đến giá trị đúc: base match { case MyConcrete(value) => base.asInstanceOf[MyConcrete].something(value) }, là có một cách để có được 'cơ sở' đúc để MyConcrete ngay cả khi muốn trích xuất "giá trị" bằng cách khai thác 'unapply' cuộc gọi được thực hiện bởi "trường hợp MyConcrete (giá trị)"? – ithkuil

+4

Hãy thử điều này: 'base match {case base @ MyConcrete (giá trị) => base.something (value)}' Rõ ràng, shadowing '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: –

215
g.asInstanceOf[Graphics2D]; 
+34

Khi tôi quen với Scala, tôi đã học không sử dụng 'asInstanceOf', vì nó đánh bại mục đích có hệ thống kiểu tĩnh và cảm thấy buồn. –

+24

Thật không may, đây là một hoạt động phổ biến khi sử dụng Swing. Đối với các hoạt động vẽ tùy chỉnh, bạn cần ghi đè phương thức 'void void paintComponent (Graphics g)' công khai. Tham số Graphics thực sự là một cá thể Graphics2D, nhưng cần có một diễn viên. Phiên bản phù hợp với mẫu có lẽ có độ chi tiết hơn là được bảo hành. Hãy nhớ rằng: An toàn vượt qua sự cường điệu và sự sung mãn của obfuscatory! – hohonuuli

+7

@hohonuuli Tôi nghĩ rằng diễn viên là tốt trong trường hợp cụ thể đó, nhưng nếu bạn sử dụng các thành phần 'scala-swing', tham số của paintComponent đã là Graphics2D do đó không có yêu cầu nào được yêu cầu –

Các vấn đề liên quan