2011-10-10 32 views
7

Trong Scala có 2 biểu diễn các số có độ chính xác kép, một là AnyVal, số khác AnyRef. Trên JVM chúng được ánh xạ tới số nguyên thủy double và lớp java.lang.Double tương ứng.Làm thế nào để tôi đại diện cho hộp đôi trong Scala tinh khiết?

Bây giờ điều gì xảy ra trên các nền tảng khác với JVM? Tôi có thể sử dụng Scala.Double cho nguyên thủy, nhưng làm cách nào để xác định rằng tôi muốn tham chiếu đến hộp được đóng hộp mà không chỉ định java.lang.Double?


[Bối cảnh - còn lại để hiểu ý nghĩa của câu trả lời của Thomasz, nhưng không phải là vấn đề cơ bản.

Tôi có một đúp mà tôi muốn tiêm với mùa xuân vào một thành phần Wicket:

class MyPanel(id: String) extends Panel(id) { 
    @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: Double = _ 

Nếu tôi chỉ định kiểu như scala.Double như trên, các vòi phun thất bại, vì nó chỉ có thể tiêm Objects.

Nếu tôi chỉ định java.lang.Double như loại lĩnh vực này, tất cả là tốt

class MyPanel(id: String) extends Panel(id) { 
    @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: java.lang.Double = _ 

Nhưng tôi đang cố gắng để giảm dependance của tôi trên rơi xuống trở lại trên API Java, vì vậy làm thế nào để đại diện cho đóng hộp Double không có nó? ]

+1

tôi đoán là đóng hộp đôi * là * 'java.lang.Double' - giống như Scala sử dụng các lớp Java cho rất nhiều thứ khác (AnyRef = java.lang.Object, String = java.lang.String). Tôi không biết chắc chắn, mặc dù. – Owen

+0

@Owen bạn đúng. –

+2

Các câu lệnh đó là đúng trên JVM. Trên CLR có các ánh xạ khác nhau và tôi muốn biết cách thể hiện Double được đóng hộp trên một trong hai. –

Trả lời

0

Tại sao không tạo loại đậu scala.Double? Khủng khiếp nhưng có vẻ như nó làm việc:

<bean id="rxAlarmLimitDb" class="scala.Double" factory-method="unbox"> 
    <constructor-arg> 
     <bean class="java.lang.Double"> 
      <constructor-arg value="4.2"/> 
     </bean> 
    </constructor-arg> 
</bean> 
+0

Tôi cho rằng vấn đề của tôi được giải quyết bằng java.Lang.Double - nhưng tôi tò mò! –

9

scala.Double == double trong Java. Khi bạn đóng hộp scala.Double, nó sẽ trở thành một java.lang.Double.

scala> val f = 45d; 
f: Double = 45.0 

scala> println("f=" + f.getClass) 
f=double 

scala> def foo(d: Any) = println("d=" + d.getClass) 
foo: (d: Any)Unit 

scala> foo(f) 
d=class java.lang.Double 

Không có cách nào tạo đối tượng kiểu scala.Double. Nó chỉ là một bí danh cho đôi. Vì vậy, đối với vấn đề của bạn, bạn cần sử dụng một số java.lang.Double hoặc đính kèm theo loại của riêng bạn và cung cấp chuyển đổi tiềm ẩn.

Định nghĩa này có ý nghĩa nếu bạn nghĩ về điều đó. Tất cả tương tác giữa mã java 1.scala yêu cầu hộp số tự động & sẽ hoạt động như mong đợi.

Nếu nó làm cho một sự khác biệt, bạn luôn có thể làm:

type BoxedDouble = java.lang.Double 

sau đó bạn sẽ không phải để xem java.lang :-)

+2

Tất cả các câu lệnh này đều đúng trên JVM, nhưng Scala nhắm vào các môi trường khác. –

+0

Từ POV của tôi phần cuối cùng về việc tạo ra một bí danh kiểu giải quyết vấn đề của DuncanMcGregor. – vadipp

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