在scala中指定以下概念的最新方法是什麼?該概念表示一個通用提取函數的接口,該接口指定了在編譯時正在提取的類。 ContructScalla中的基本元編程技巧
//type TFunc = (Document) => Tuple2[Option[Seq[Int]],Option[Seq[String]]]
val ex = new Extractor[Int]((x: Document)=> {
(Some(Seq(1)),Some(Seq("hassan")))
})
的Contruct
的定義
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import scala.collection.JavaConversions._
trait ExtractorBase {
type ExtractedType
type RetType = Tuple2[Option[Seq[ExtractedType]],Option[Seq[String]]]
type ExtractorFunction = (Document) => RetType
def extractor : ExtractorFunction
}
class Extractor[T] (extractor_in: Any) extends ExtractorBase {
type ExtractedType = T
val extractor : ExtractorFunction = extractor_in
}
實例在瞬間提取函數沒有被正確走樣之一:
[error] /Users/hassan/code/scala/extractor/hon.scala:14: type mismatch;
[error] found : Any
[error] required: org.jsoup.nodes.Document => (Option[Seq[Extractor.this.ExtractedType]], Option[Seq[String]])
[error] (which expands to) org.jsoup.nodes.Document => (Option[Seq[T]], Option[Seq[String]])
[error] val extractor : ExtractorFunction = extractor_in
我如何參考泛型特徵數據在擴展特徵的類的定義之外?在編譯時和運行時。例如編譯時我寧願有:
性狀ExtractorBase [T] { 類型ExtractedType = T 型RetType = Tuple2 [選項[序號[ExtractedType],選項[SEQ [字符串]]] 類型ExtractorFunction =(文件)=> RetType DEF提取:ExtractorFunction }
然後
class Extractor[T] (extractor_in: ExtractorBase[T].ExtractorFunction) extends ExtractorBase
類似於C++特徵的類型。
在運行時,我不介意在特徵中獲取類型信息。
有可能是一個更習慣的方式來創建特質的實例,我不想去通過
Extractor[T]
類。有沒有辦法與特質的伴侶對象做到這一點?
編輯
ANKUR的回答使我對正確的道路。我從我的曲目中錯過了#操作符。時間打扮起來。
trait ExtractorBase[T] {
type ExtractedType = T
type RetType = Tuple2[Option[Seq[ExtractedType]],Option[Seq[String]]]
type ExtractorFunction = (Document) => RetType
def extractor : ExtractorFunction
}
class Extractor[T] (extractor_in: ExtractorBase[T]#ExtractorFunction) extends ExtractorBase[T] {
def extractor : ExtractorBase[T]#ExtractorFunction = extractor_in
}
領導到:
val ex = new Extractor[Int]((x: Document)=> {
(Some(Seq(1)),Some(Seq("hassan")))
})