Java中的Scala Tuple类型推断

时间:2012-04-20 14:27:49

标签: java scala

这可能是一个非常愚蠢的问题,但我在Scala / Java互动方面有点玩,并且想知道Tuples的表现如何。

现在,我知道(Type1, Type2)语法只是Tuple2<Type1, Type2>的语法糖,因此,当调用在普通Java类中返回Tuple2的Scala方法时,我希望得到一个返回类型Tuple2<Type1, Type2>

为清楚起见,我的Scala代码:

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

Java代码:

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

编译器似乎希望这是参数化类型<Object,Object>,而不是在我的情况下,<Integer,Integer>(这是我期望的,至少)。

我的想法是否存在严重缺陷,是否有完全合理的解释?

OR

我的Scala代码中是否存在问题,并且在我知道将为Java代码提供API的情况下,有一种更明确的方式吗?

OR

这只是一个限制吗?

1 个答案:

答案 0 :(得分:9)

Int是Scala的整数类型,is a value class,所以它得到特殊处理。它与java.lang.Integer不同。如果您需要,可以专门指定java.lang.Integer

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

[dlee@dlee-mac 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();
}