使用Scala泛型:Class [T]不接受参数

时间:2013-03-02 19:32:16

标签: scala generics

我有一个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正常工作?

1 个答案:

答案 0 :(得分:7)

Scala总是使用方括号作为类型参数,所以你想做的只是:

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

顺便说一句,令人困惑的诊断是因为产生classOf实例的java.lang.Class不是可以像函数或方法一样调用的值(“不带参数”) 。请记住,Scala将始终尝试将类型参数推断为泛型,例如classOf,奇怪的是,它在没有任何类型参数的情况下成功使用。它推断出类型Nothing

scala> classOf
res1: Class[Nothing] = null