Tôi nghĩ rằng tôi hiểu được mới "class giá trị" tính năng của Scala 2.10, bằng cách so sánh với newtype
Haskell của:Các lớp giá trị do người dùng định nghĩa trông như thế nào từ Java?
trait BoundedValue[+This] extends Any { this: This =>
def upperBound: This
def lowerBound: This
}
class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] {
val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")
override val upperBound: Probability = new Probability(0.0)
override val lowerBound: Probability = new Probability(1.0)
// Implement probability arithmetic here;
// will be represented by Double at runtime.
}
Các câu hỏi tôi có được, làm thế nào để một lớp giá trị dường như mã Java có sử dụng gói Scala trong đó nó được khai báo? Lớp giá trị có xuất hiện như một lớp tham chiếu từ phía Java hay nó bị xóa hoàn toàn (và do đó xuất hiện như kiểu nó kết thúc tốt đẹp)? Nói cách khác, cách an toàn kiểu là các lớp giá trị khi Java có liên quan đến cấp nguồn?
EDIT
Đoạn mã trên sẽ không biên dịch, theo SIP-15 tài liệu (liên kết trong câu trả lời của Daniel), bởi vì các lớp học giá trị không được phép có bất cứ logic khởi, bởi vì hoặc v
phải rõ ràng là val hoặc Probability
phải có phương thức unbox
và phương thức box
tương ứng trên đối tượng đồng hành của nó và vì các lớp giá trị phải có chính xác một trường. Mã đúng là:
trait BoundedValue[This <: BoundedValue[This]] extends Any { this: This =>
def upperBound: This
def lowerBound: This
}
class Probability private[Probability] (value: Double) extends AnyVal with BoundedValue[Probability] {
@inline override def upperBound: Probability = new Probability(0.0)
@inline override def lowerBound: Probability = new Probability(1.0)
@inline def unbox: Double = value
// Implement probability arithmetic here;
// will be represented by Double at runtime (mostly).
}
object Probability {
@throws(classOf[IllegalArgumentException])
def box(v: Double): Probability = if ((v >= 0.0) && (v <= 1.0)) new Probability(v) else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")
}
Bản thân câu hỏi vẫn hợp lệ.
Trong chương trình thử nghiệm của bạn, bạn có thể đẩy giá trị được bọc bên ngoài giới hạn hợp lệ từ Java không? –
@DavidHarkness Tôi không có quyền truy cập vào máy có 2.10.0-M4 trên máy tính ngay bây giờ, vì vậy tôi không biết. Tôi sẽ kiểm tra khi nào có thể. –