2016-09-16 16 views
0

以下のコードでは、Intパラメータ(値3)を持つオブジェクトのメソッドを呼び出そうとしています。これは、Int3が互換性のない型であるというエラーを返します。Intパラメータを使用したスカラ反射

//Using scala's Int does not work! 
object MyObject{ 
    def handleInt(id:Int) : Boolean = { 
    true 
    } 
} 

object testApp extends App { 
    val obj = MyObject.getClass 
    val method = obj.getDeclaredMethod("handleInt", classOf[Int]) //Int.getClass shows the same behavior 
    val rsp = method.invoke(obj, 3) 
} 

Error:(106, 41) the result type of an implicit conversion must be more specific than AnyRef

val rsp = method.invoke(obj, 3) 

Error:(106, 41) type mismatch; found : Int(3) required: Object

val rsp = method.invoke(obj, 3) 

私はこの仕事ができる唯一の方法は、JavaのIntegerにすべての署名を変更することで、ここで多くのものを変更しようとしました。コードは次のようになります。

//This works with Java's Integer 
object MyObject{ 
    def handleInt(id:Integer) : Boolean = { 
    true 
    } 
} 

object testApp extends App { 
    val obj = MyObject.getClass 
    val method = obj.getDeclaredMethod("handleInt", classOf[Integer]) 
    val rsp = method.invoke(obj, 3) 
} 

私の質問(複数可)は、次のとおりです。これはなぜ起こるか

  1. 誰かが説明できますか?私と思うスカラのIntは、javaのプリミティブint(これはオブジェクトとは考えられない理由です)をラップしますが、わかりません。
  2. ScalaのIntタイプを使用してこれを実現する方法はありますか?
  3. このようにスカラ型とJava型を混在させることはできますか?それは良い練習ですか?

答えて

0

いいえScalaタイプは使用できません。

JavaとScalaタイプを混在させてOKです。

リフレクションは、実行時にクラスのバイトコードを読み取ることを扱います。バイトコードレベルでは、すべてのスカラー型がJava型に変換されるため、Java型のみが表示されます。

1

最初の問題は、間違ったオブジェクトのメソッドを呼び出すことです。objにはhandleIntメソッドがありません。MyObjectはありません。 2つめは一種の辺のケースです:invokeObject...のvarargsをとり、通常はIntObjectに直接変換しません。あなたはタイプの帰納法を使って "IntegerにボックスInt"と言うことができ、それからScalaはそれを自動的にObjectにアップキャストします。

ので、これらの2つの修正を組み合わせる:あなただけ

val rsp = method.invoke(MyObject, 3: Integer) 

があなたの最後の質問に答えるためにhandleIntまたはval methodを、変更する必要はありません:Integerjava.lang.Doubleの使用などでは一般的ではありませんScalaコードですが、特に問題はありません。そして反射はあなたがそれらを使用しなければならないかもしれない分野の1つです。

関連する問題