Scala:类型方法,返回一个子类型
我想写一个函数,返回一个部分应用的函数,它返回一个特定的抽象类的子类型。Scala:类型方法,返回一个子类型
我有一个抽象类
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
}
}
基于一条信息的上述方法返回一个部分应用的函数,它可以在一个la在剩余的必要论证可用的地方。
你们中的一些人可能已经猜到我试图根据ISO规范解析ISO文件。我这样做基本上是为了体验,它看起来像一个有趣的面向对象和功能设计问题。
要创建一个特定的盒式阅读器,我需要一个基本框,它是标题信息和基本上做特定文件阅读的阅读器对象。我想写一个函数给定一个盒子(盒子类型),我得到一个部分应用的函数,返回一个子类型的IsoBoxReader。通过这种方式,调用者可以使用其IsoReader版本(文件读取,有状态对象)创建实际实例。编译器抱怨模式匹配,特别是调用类型不匹配。
它说发现FileTypeBoxReader但预计牛逼
然而,根据Type参数,因为它是一个子类IsoBoxReader的不FileTypeBoxReader有效的返回值?
试试这个:
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
是不对的。
您的'[IsoBoxReader]'应该从签名中删除,因为它是不正确的。 – 2013-02-20 06:43:57
这是我的错误。谢谢。 – Jiangzhou 2013-02-20 06:48:59
谢谢...看起来我最好回去了解更多关于打字方法......你现在说的话对我来说意义重大... – 2013-02-20 07:41:51
“boxType”在哪里定义?它的定义是什么?请至少创建自包含的代码片段。 – 2013-02-20 07:13:26
boxType是一个字符串...它只是一个选择器... – 2013-02-20 07:32:48