Scala: преобразовать тип возврата в пользовательскую черту

StackOverflow https://stackoverflow.com/questions/3489176

Вопрос

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

Это было полезно?

Решение

Догадаться. Взял меня несколько попыток понять:

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top