2013-02-20 80 views
0

我想写一个函数,返回一个部分应用的函数,它返回一个特定的抽象类的子类型。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有效的返回值?

+1

“boxType”在哪里定义?它的定义是什么?请至少创建自包含的代码片段。 – 2013-02-20 07:13:26

+0

boxType是一个字符串...它只是一个选择器... – 2013-02-20 07:32:48

回答

1

试试这个:

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是不对的。

+1

您的'[IsoBoxReader]'应该从签名中删除,因为它是不正确的。 – 2013-02-20 06:43:57

+0

这是我的错误。谢谢。 – Jiangzhou 2013-02-20 06:48:59

+0

谢谢...看起来我最好回去了解更多关于打字方法......你现在说的话对我来说意义重大... – 2013-02-20 07:41:51