2010-08-15 11 views
4

Я написал пользовательский признак, который расширяет Iterator [A], и я хотел бы иметь возможность использовать методы, которые я написал на Iterator [A], который является возвращен из другого метода. Это возможно?Scala: преобразовать возвращаемый тип в пользовательский признак

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

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

Я все еще пытаюсь получить мою голову вокруг всей implicits вещи и не имея много, как написание метода в определении Bar объекта. Как я могу обернуть такой предмет, чтобы работать так, как я хотел бы выше?

ответ

6

Понял. Мне несколько попыток понять:

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

и все готово. Настолько удивительно короткий.

+1

, вероятно, хорошая идея вызвать метод 'iterator2increment' –

2

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

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

+0

Я чувствую, что должно быть неявное преобразование, которое решит трюк. Однако решение продолжает ускользать от меня. – wheaties