【问题标题】:Scala: convert a return type into a custom traitScala:将返回类型转换为自定义特征
【发布时间】:2010-08-15 20:46:10
【问题描述】:

我编写了一个扩展 Iterator[A] 的自定义特征,我希望能够使用我在从另一个方法返回的 Iterator[A] 上编写的方法。这可能吗?

trait Increment[+A] extends Iterator[A]{
    def foo() = "something"
}

class Bar( source:BufferedSource){
    //this ain't working
    def getContents():Increment[+A] = source getLines
}

我仍在努力理解整个隐含的事情,并且不太喜欢在 Bar 对象定义中编写方法。我将如何包装这样一个项目以按照我上面想要的方式工作?

【问题讨论】:

    标签: scala implicit implicit-conversion implicit-typing


    【解决方案1】:

    想通了。试了几次才明白:

    object Increment{
        implicit def convert( input:Iterator[String] ) = new Increment{
            def next() = input next
            def hasNext() = input hasNext
        }
    }
    

    我已经完成了。太短了。

    【讨论】:

      【解决方案2】:

      我认为如果不耍花招,这是不可能的。混合继承发生在编译时,它可以被静态类型检查,并且它总是针对另一个类、特征等。在这里,您尝试在运行时“即时”在现有对象上添加特征。

      有一些解决方法,比如隐式转换,或者代理。可能“最干净”的方法是使 Increment 成为委托给底层迭代器的包装类。根据您的用例,可能还有其他解决方案。

      【讨论】:

      • 我觉得必须有一个隐式转换来解决这个问题。但是,我仍然无法找到解决方案。
      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2020-12-31
      • 2022-01-22
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多