11

これはおそらく非常にわかりにくい質問ですが、私は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>あることを期待しているようです(少なくともこれは私が期待していたことです)。

私の考えはひどく欠陥があり、これについて完全に合理的な説明がありますか?

また

私のScalaコードに問題があり、Javaコード用のAPIを提供することがわかっている場合は、もっと明示的にする方法がありますか?

また

これは単なる制限ですか?

4

1 に答える 1

9

Intは値クラスであるScalaの整数型であるため、特別な扱いを受けます。とは異なり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();
}
于 2012-04-20T14:54:21.147 に答える