2012-04-20 51 views
11

Đây có lẽ là một câu hỏi rất ngớ ngẩn, nhưng tôi đã chơi một chút với tương tác Scala/Java, và đã tự hỏi Tuples chơi tốt như thế nào.Suy luận kiểu Scala Tuple trong Java

Bây giờ, tôi biết rằng cú pháp (Type1, Type2) là đường chỉ đơn thuần là cú pháp cho Tuple2<Type1, Type2>, và vì vậy, khi gọi một phương pháp Scala mà trả về một Tuple2 trong một lớp Java đơn giản, tôi đã mong đợi để có được một kiểu trả về của Tuple2<Type1, Type2>

Để rõ ràng, mã Scala của tôi: mã

def testTuple:(Int,Int) = (0,1) 

Java:

Tuple2<Object,Object> objectObjectTuple2 = Test.testTuple(); 

dường như trình biên dịch hy vọng thi s được các loại tham số <Object,Object>, thay vì, trong trường hợp của tôi, <Integer,Integer> (đây là những gì tôi đã mong đợi, ít nhất).

Suy nghĩ của tôi có thiếu sót và có một lời giải thích hoàn toàn hợp lý cho việc này không?

HOẶC

Có một vấn đề trong mã Scala của tôi, và có một cách hiện hữu hơn ... rõ ràng, trong các trường hợp mà tôi biết sẽ cung cấp một API cho mã Java?

HOẶC

Đây có phải chỉ là hạn chế không?

Trả lời

9

Int là loại số nguyên của Scala, trong đó is a value class, do đó, nó được xử lý đặc biệt. Nó khác với java.lang.Integer. Bạn có thể chỉ định java.lang.Integer cụ thể nếu đó là những gì bạn cần.

[[email protected] scala]$ cat SomeClass.scala 
class SomeClass { 
    def testIntTuple: (Int, Int) = (0, 1) 
    def testIntegerTuple: (java.lang.Integer, java.lang.Integer) = (0, 1) 
} 

[[email protected] scala]$ javap SomeClass 
Compiled from "SomeClass.scala" 
public class SomeClass implements scala.ScalaObject { 
    public scala.Tuple2<java.lang.Object, java.lang.Object> testIntTuple(); 
    public scala.Tuple2<java.lang.Integer, java.lang.Integer> testIntegerTuple(); 
    public SomeClass(); 
} 
+0

Vì vậy, 'Int' không phải là một lớp Scala bình thường? (Nếu có, thì phiên bản 'Int' phải được biên dịch thành' scalaTuple2 'hoặc một cái gì đó tương tự, không?) – aioobe

+1

Đúng. Từ [scaladocs] (http://www.scala-lang.org/api/current/scala/Int.html): "' Int' là một thành viên của các lớp giá trị, những người có các cá thể không được biểu diễn dưới dạng đối tượng hệ thống máy chủ cơ bản. " [Trang mô tả các loại thống nhất] (http://docs.scala-lang.org/tutorials/tour/unified_types.html) có thể giải thích rõ hơn về nó. – leedm777

+0

Câu trả lời tuyệt vời @ dave, cảm ơn bạn, điều đó có ý nghĩa hoàn hảo vì Int không thể được dịch một cách kỳ diệu thành một lớp Java, tôi đã giả sử nó sẽ được dịch thành Integer. – pcalcao

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