我正在尝试编写一个函数,它返回一个部分应用的函数,该函数返回一个特定抽象类的subType。
我有一个抽象课
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
但是,根据类型参数,既然FileTypeBoxReader是IsoBoxReader的子类型,那么它不是一个有效的返回值吗?
发布于 2013-02-20 14:38:48
试试这个:
def recognize( box ): (IsoReader) => IsoBoxReader =
{
box.boxType match {
case "ftyp" => ( isoReader: IsoReader ) => new FileTypeBoxReader( box, isoReader )
case _ => // return some other box type
}
}def recognize[ T <: IsoBoxReader ]( box ): (IsoReader) => T应该适用于IsoBoxReader的子类型的任何特定类型,这在这种情况下显然不可能。换句话说,因为实际类型是在运行时由box.boxType确定的,所以在recognize()的调用点,类型T不能被静态地确定为。所以在这里使用类型参数T是不正确的。
https://stackoverflow.com/questions/14973483
复制相似问题