10

Tôi muốn thêm các chuyển đổi ngầm vào các lớp Java được tạo bởi một công cụ tạo mô hình. Vì vậy, tôi muốn thêm chúng vào đối tượng đồng hành của các lớp đó, để trình biên dịch tự động tìm chúng. Nhưng tôi không thể thêm chúng vào một tệp riêng biệt, vì bạn đồng hành phải được xác định trong cùng một tệp. Tôi có thể làm được gì không?Trong Scala, làm thế nào tôi có thể định nghĩa một đối tượng đồng hành cho một lớp được định nghĩa trong Java?

Tất nhiên, tôi có thể xác định tất cả chuyển đổi tiềm ẩn của mình trong đối tượng khác và sau đó đưa nó vào phạm vi, nhưng điều này yêu cầu nhập thêm. Bất kỳ giải pháp nào khác?

+2

Bạn có thể xác định chuyển đổi tiềm ẩn trong đối tượng gói, tránh nhập thêm. – axel22

+0

Các lớp Java không có đối tượng đồng hành. Bạn có nghĩa là bạn đang cố gắng để lừa gạt và làm cho nó trông giống như một lớp Java có một đối tượng đồng hành? –

+0

@Rex Kerr: Vâng, tôi không biết nó bị coi là gian lận. @ axel22: Ý tưởng hay, tôi nghĩ tôi sẽ tiếp tục với điều đó! –

Trả lời

9

Với trình biên dịch Scala như nó đứng bây giờ không có cách để xác định các đối tượng đồng hành khác hơn là đặt chúng trong cùng một tệp. Điều tốt nhất bạn có thể làm là một đối tượng không đồng hành với cùng một gói và tên và nhập thêm.

Nếu bạn có thể nghĩ ra cách tốt để tạo ra bạn đồng hành sau giờ học mà không vi phạm các giả định về đóng gói, vui lòng đăng bài trên http://groups.google.com/group/scala-debate vì nó rõ ràng sẽ là một tính năng rất hữu ích.

9

Bạn có thể xác định đối tượng đồng hành của riêng mình tất nhiên, điều mà tôi thường làm trong sắp xếp giống như Predef riêng của dự án của riêng tôi. Ví dụ:

object domain { 

    type TimeUnit = java.util.concurrent.TimeUnit 
    object TimeUnit { 
    def valueOf(s : String) = java.util.concurrent.TimeUnit.valueOf(str) 
    val Millis = java.util.concurrent.TimeUnit.MILLISECONDS 
    //etc 
    } 

Sau đó, điều này có thể được sử dụng:

import my.domain._ 
val tu : TimeUnit = TimeUnit.valueOf("MILLISECONDS") 

Nhưng domain.TimeUnit của bạn là một mô-đun (tức là scala object)

+0

Đó sẽ là một "đối tượng độc lập", không phải là một đối tượng đồng hành, phải không? (kết quả cuối cùng là như nhau ở đây) – VonC

+3

nó, ít nhất, sẽ không làm việc cho chuyển đổi tiềm ẩn (đó là một điểm ngọt của đối tượng đồng hành) –

+0

Điều đó là đúng - nhưng nó vẫn là một đối tượng theo đúng nghĩa của nó và có thể đã vượt qua khoảng –