3

Java アプリケーションがあり、Scala に移行したいと考えています。だから私はこの内部クラスを持っています(元のもの、あなたはここで見つけることができます:http://developer.android.com/reference/android/app/ActionBar.html#newTab() : public static class TabListener ...)

class MyListener[T <: MySuperClass]
    (var myClass: Class[T], ...) 
    extends MyActionListener { ... }

私の問題は、このクラスを呼び出す方法です。私はこれを試しました:

myObject.setMyListener(
    new MyListener[MySubClassOfMySuperClass]
    (classOf(MySubClassOfMySuperClass), ...));

しかし、IDE (classOf(MySubClassOfMySuperClass)) でエラーが発生します。

Class[T] does not take parameters

だから、私は2つの質問があります:

  • class MyListener特にClass[T]、これを Java コードからコピーしたため (Android API のハイパーリンクを参照)、私の Scalaは正しく定義されていますか?
  • 仕事を得るために私は何をしなければなりませんnew MyListenerか?
4

1 に答える 1

9

Scalaは常に型パラメーターに角かっこを使用するので、あなたがしたいのは単純にこれです:

myObject.setMyListener(new MyListener[MySubClassOfMySuperClass]
                           (classOf[MySubClassOfMySuperClass],  ...));

ちなみに、紛らわしい診断はclassOf、のインスタンスを生成するがjava.lang.Class、関数やメソッドのように呼び出すことができる値ではないためです(「パラメーターを受け取らない」)。Scalaは常に、などのジェネリックスに型パラメーターを推測しようとすることを忘れないでくださいclassOf。奇妙なことに、型パラメーターなしで使用すると、正常に推測されます。タイプを推測しNothingます:

scala> classOf
res1: Class[Nothing] = null
于 2013-03-02T19:38:58.547 に答える