2013-02-20 78 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