2012-04-20 89 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