Я пытаюсь написать функцию, которая возвращает частично примененную функцию, которая возвращает подтип определенного абстрактного класса.
У меня есть абстрактный класс
abstract class IsoBoxReader
У меня есть производный класс
class FileTypeBoxReader( val box, val isoReader ) extends IsoBoxReader
Я хочу сделать что-то подобное, и я не уверен, что это возможно:
def recognize[ T <: IsoBoxReader ]( box ): (IsoReader) => T =
{
box.boxType match {
case "ftyp" => ( isoReader: IsoReader ) => new FileTypeBoxReader( box, isoReader )
case _ => // return some other box type
}
}
Вышеуказанный метод, основанный на одной части информации, возвращает частично примененную функцию, которую можно использовать позже, когда доступен оставшийся необходимый аргумент.
Некоторые из вас могли догадаться, что я пытаюсь анализировать медиа-файлы Iso на основе спецификации ISO. Я делаю это в основном для опыта, и это кажется интересной проблемой объектно-ориентированного и функционального дизайна.
Чтобы создать специальный блок чтения, мне нужен базовый блок, который представляет собой информацию заголовка, и объект чтения, который в основном выполняет чтение определенного файла. Я хочу написать функцию, которая с учетом блока (с типом блока) я получаю частично примененную функцию, которая возвращает подтип IsoBoxReader. Таким образом, вызывающий объект может создать фактический экземпляр со своей версией IsoReader (чтение файла, объект с отслеживанием состояния). Компилятор жалуется на совпадение с шаблоном, в частности, на несоответствие типов.
Он говорит, что нашел FileTypeBoxReader, но ожидал T
Однако, исходя из аргумента Type, не является ли FileTypeBoxReader допустимым возвращаемым значением, поскольку он является подтипом IsoBoxReader?
boxType
? Каково его определение? Пожалуйста, создавайте как минимум автономные фрагменты кода. - person Randall Schulz   schedule 20.02.2013