代码之家  ›  专栏  ›  技术社区  ›  wheaties

scala:将返回类型转换为自定义特征

  •  4
  • wheaties  · 技术社区  · 14 年前

    我编写了一个扩展迭代器[A]的自定义特性,我希望能够使用我在迭代器[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 对象定义。我该如何包装这样一个项目的工作方式,我想以上?

    2 回复  |  直到 14 年前
        1
  •  6
  •   wheaties    14 年前

    明白了。我试了几次理解:

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

    我完了。如此之短,令人惊讶。

        2
  •  2
  •   Landei    14 年前

    我认为不耍花招是不可能的。mixin继承发生在编译时,它可以静态地进行类型检查,并且总是针对另一个类、特性等。在这里,您尝试在运行时将特性“动态”地附加到现有对象上。

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