Scala: конвертировать возвращаемый тип в пользовательскую черту - PullRequest
4 голосов
/ 16 августа 2010

Я написал пользовательскую черту, которая расширяет 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. Как мне обернуть такой предмет, чтобы он работал так, как я хотел бы выше?

Ответы [ 2 ]

6 голосов
/ 16 августа 2010

Разобрался. Взял у меня несколько попыток понять:

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

и я закончил. Так удивительно коротко.

2 голосов
/ 16 августа 2010

Я не думаю, что это возможно без трюков.Смешанное наследование происходит во время компиляции, когда он может быть статически проверен на тип и всегда нацелен на другой класс, черту и т. Д. Здесь вы пытаетесь прикрепить черту к существующему объекту «на лету» во время выполнения.

Есть обходные пути, такие как неявные преобразования или, возможно, прокси.Вероятно, самым «чистым» способом было бы сделать Increment классом-оболочкой, делегирующим нижележащему итератору.В зависимости от вашего варианта использования могут быть и другие решения.

...