2012-04-20 133 views
11

這可能是一個非常不好的問題,但我在玩Scala/Java的交互,並且想知道Tuples的發揮如何。Java中的Scala元組類型推斷

現在,我知道(Type1, Type2)語法只是語法糖Tuple2<Type1, Type2>,因此,調用Scala的方法,在一個普通的Java類返回Tuple2的時候,我期待得到Tuple2<Type1, Type2>

返回類型

爲了清楚起見,我的Scala代碼:

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

Java代碼:

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

看來編譯器期望THI s是參數化類型<Object,Object>,而不是在我的情況下,<Integer,Integer>(這是我期望的,至少)。

我的想法是否有深刻的缺陷,對此有一個完全合理的解釋嗎?

OR

有沒有在我的Scala代碼的問題,而且也被更多...明確的一個方式,我知道將提供Java代碼的API的案件?

這是一個簡單的限制嗎?

回答

9

Int是斯卡拉的整數型,其中is a value class,所以得到了特殊待遇。它不同於java.lang.Integer。如果這是您需要的,您可以指定java.lang.Integer

[[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

因此,'Int'不是普通的Scala類嗎? (如果是,那麼'Int'版本應該被編譯成'scalaTuple2 '或類似的東西,不是嗎?) – aioobe 2012-04-20 14:56:19

+1

正確。從[scaladocs](http://www.scala-lang.org/api/current/scala/Int.html):「'Int'是值類的成員,那些實例未被表示爲對象的元素底層的主機系統「。 [描述統一類型的頁面](http://docs.scala-lang.org/tutorials/tour/unified_types.html)可能會更好地解釋它。 – leedm777 2012-04-20 14:58:47

+0

偉大的答案@dave,謝謝,這是非常有道理的,因爲Int不能被神奇地轉換成Java類,我假設它會被轉換爲Integer。 – pcalcao 2012-04-20 15:01:34