使用Scala泛型:类[T]不带参数



我有一个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

我有两个问题:

  • 是我的Scala class MyListener定义正确,特别是Class[T],因为我从Java代码复制这个(见Android API的超链接)?
  • 我要做什么才能让new MyListener工作?

Scala总是使用方括号来表示类型参数,所以你要做的只是这样:

myObject.setMyListener(new MyListener[MySubClassOfMySuperClass]
                           (classOf[MySubClassOfMySuperClass],  ...));
顺便说一下,这个令人困惑的诊断是因为产生java.lang.Class实例的classOf不是一个可以像函数或方法那样调用的值("不带参数")。请记住,Scala总是尝试推断泛型(如classOf)的类型参数,奇怪的是,在不使用任何类型参数的情况下,它会成功地做到这一点。它推断类型Nothing:
scala> classOf
res1: Class[Nothing] = null

最新更新