scala - 使用Scala泛型: Class[T] does not take parameters

标签 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 的超链接)?
  • 我需要做什么才能让新的 MyListener 正常工作?

最佳答案

Scala 总是使用方括号作为类型参数,所以你要做的就是这样:

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

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

scala> classOf
res1: Class[Nothing] = null

关于scala - 使用Scala泛型: Class[T] does not take parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178499/

相关文章:

generics - 如何使用 Scala 的 Manifest 类在运行时实例化已删除的类?

logging - 如何在 'for' 理解中添加跟踪?

c# - 过滤属性名称为字符串的模板列表

c# - 泛型、重载决议和委托(delegate)(抱歉,找不到更好的标题)

c# - 为什么 VB Parallel.ForEach 不能推断我的循环项类型?

javascript - 扩展独占联合的 typescript 通用参数

scala - SonarQube 的 Scala 配置文件在哪里?

scala - 类型投影别名因类型限制而失败

scala - 如何在 Play Framework 关闭期间等待 Actor 停止?

java - 使用子类异常实现接口(interface)