scala - 如何使用 Scala 的单例对象类型?

标签 scala types object singleton

我正在编写一个类作为一系列单例对象的基类。在每个单例对象中,都会有代表某些属性的 val,我想编写一个方法,对于每个单例对象,它只接受由它创建的对象。

所以我有以下几点:

class Obj[M <: Maker]

class Maker {
  implicit val me: this.type = this
  def make[M <: Maker](implicit maker: M) = new Obj[M]
  def accept(obj: Obj[this.type]) = {...}
}

到现在为止还挺好。然后我想声明这些单例对象之一:
object M extends Maker {
  val a = make
}

但是,如果我尝试这样做:
M.accept(M.a)

然后我得到一个编译时错误:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]

我的问题:
  • 什么类型的object com.test.M ,和com.test.M.type有什么区别?
  • 我怎样才能以更聪明的方式做到这一点?
  • 最佳答案

    与时俱进,我的好人!我在 24 小时前修复了这个问题。接下来,我希望看到迅猛龙追逐渡渡鸟,在他们的点播屏幕保护程序上查看股票报价时疯狂地敲打他们的马车鞭子。

    有问题的提交是:http://lampsvn.epfl.ch/trac/scala/changeset/23622

    // 1130.scala
    class Obj[M <: Maker]
    
    class Maker {
      implicit val me: this.type = this
      def make[M <: Maker](implicit maker: M) = new Obj[M]
      def accept(obj: Obj[this.type]) = ()
    }
    
    object M extends Maker {
      val a = make
    }
    
    object Test {
      def main(args: Array[String]): Unit = {
        M.accept(M.a)
      }
    }
    
    // too old
    % /scala/inst/scala-2.9.0.r23619/bin/scalac ./1130.scala 
    ./1130.scala:15: error: type mismatch;
     found   : Obj[object M]
     required: Obj[M.type]
        M.accept(M.a)
                   ^
    one error found
    
    // fresh enough
    % /scala/inst/scala-2.9.0.r23624/bin/scalac ./1130.scala 
    %
    

    关于scala - 如何使用 Scala 的单例对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315678/

    相关文章:

    scala序列化总是抛出异常,为什么?

    scala - Scala 如何获得 f 字符串插值的类型安全

    java - 无法返回转换为 String[] 的 Object[]

    ruby - 如何销毁Ruby对象?

    parsing - EBNF 到 Scala 解析器组合器

    scala - 如何实现TCO的递归

    python - 如何注释函数枚举

    c++,如何将字符串、整数和浮点值存储到数组中并检索存储的值

    Scala - 使用方法创建用户类型

    javascript - 如果在 Array.map 期间键已经存在,则将值推送到对象