Scala: преобразовать тип возврата в пользовательскую черту
-
28-09-2019 - |
Вопрос
Я написал пользовательскую черту, которая расширяет итератор [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
}
}
И я закончил. Так удивительно коротко.
Другие советы
Я не думаю, что это возможно без воспроизведения трюков. Временное наследование микс происходит во время компиляции, когда он может быть проверяется типом статически, и он всегда нацелен на другой класс, черту и т. Д. Здесь вы пытаетесь присоединиться к черту на существующем объекте «на лету» во время выполнения.
Есть обходные пути, такие как неявные преобразования, или, возможно, прокси. Вероятно, «самый чистый» способ сделать увеличение класса обертки, делегируя в базовый итератор. В зависимости от вашего случая использования могут быть другие решения.