Đưa ra một biến với loại Graphics
, làm cách nào để truyền nó đến Graphics2D
trong Scala?Làm cách nào để truyền một biến trong Scala?
Trả lời
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á.
g.asInstanceOf[Graphics2D];
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. –
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
@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 –
- 1. Làm cách nào để truyền một biến trong khi sử dụng `require` trong node.js?
- 2. Làm cách nào để "biến" một biến?
- 3. Truyền một biến làm đối số mẫu
- 4. Làm cách nào để truyền một chuỗi [] trong Clojure?
- 5. Làm cách nào để sắp xếp một mảng trong Scala?
- 6. Làm cách nào để truyền mảng qua $ _GET trong php?
- 7. Làm cách nào để truyền các biến sang layout.phtml trên toàn cầu trong ZF2?
- 8. Nội suy chuỗi trong Scala 2.10 - Làm thế nào để nội suy một biến String?
- 9. Làm thế nào để vượt qua một hoặc không có biến arg trong scala?
- 10. Làm cách nào để triển khai biến áp đơn lẻ `List` trong Scala?
- 11. Làm cách nào để truyền id đến một float?
- 12. Làm cách nào để tạo một biến số biến?
- 13. Làm thế nào để chuyển đổi HashMap có thể biến đổi thành một tương đương bất biến trong Scala?
- 14. Scala, làm thế nào để đọc nhiều hơn một số nguyên trong một dòng và nhận chúng trong một biến?
- 15. Làm thế nào để bạn chuyển đổi một java.util.Collections.unmodifiableMap thành một bản đồ Scala bất biến?
- 16. Có cách nào để truyền một biến thông qua khi gọi RenderComponentPresentation không?
- 17. Làm thế nào để lát một tuple trong scala
- 18. Làm cách nào để truyền một loại cho một bigint trong MySQL?
- 19. Làm cách nào để truyền một đôi vào một int trong Java?
- 20. Làm cách nào để truyền một đối tượng sự kiện đến một hàm trong Javascript?
- 21. Truyền một biến cho PhantomJS qua exec
- 22. Làm cách nào để truyền một chuỗi làm đối số hàm trong MATLAB?
- 23. Làm cách nào để sử dụng JUnit ExpectedException trong Scala?
- 24. Làm cách nào để tạo một hàm một phần với Generics trong Scala?
- 25. Làm cách nào để biến danh sách Scala thành các cặp?
- 26. Làm thế nào để nối một chuỗi với một biến?
- 27. Làm thế nào để ghi đè lên một biến có thể thay đổi trong Trait trong scala?
- 28. Scala: làm thế nào để nhúng một máy chủ web nhỏ vào một ứng dụng scala?
- 29. Làm thế nào để khởi tạo biến trống từ kiểu của riêng bạn trong Scala?
- 30. Scala nhiều nhiệm vụ để biến hiện
+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? –
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ị)"? – ithkuilHã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: –