2013-09-26 21 views
1

我有幾個的DAO(使用Slick)像下面方法返回類型[C <:記錄,T <:表[U]]工作不正常

abstract class SuperRecord 

abstract class SubSuperRecord extends SuperRecord 

class Record1 extends SuperRecord 

class Record2 extends SubSuperRecord 

abstract class SuperTable[T <: SuperRecord] extends slick.driver.MySQLDriver.simple.Table[T] 

abstract class SubSuperTable[T <: SubSuperRecord] extends SuperTable[T] 

object DAO1 extends SuperTable[Record1] 

object DAO2 extends SubSuperTable[Record2] 

我在返回這些下面的方法 - 我不是在聲明返回類型,我讓那

def getTable(table: String) = { 
    table match { 
    case "DAO1" => DAO1 
    case "DAO2" => DAO2 
    case _ => throw new IllegalArgumentException("invalid table") 
    } 
} 

我試圖重構返回一個Try對象方法的類型推理引擎照顧,但是這似乎是混淆類型推理引擎

def getTable(table: String) = Try { 
    table match { 
    case "DAO1" => DAO1 
    case "DAO2" => DAO2 
    case _ => throw new IllegalArgumentException("invalid table") 
    } 
} 

當我打開包裝就這個成功,我得到一個序列化的,所以我想,以協助類型推理引擎

def getTable[T <: SuperRecord, U <: SuperTable[T]](table: String): Try[U] = Try { 
    table match { 
    case "DAO1" => DAO1 
    case "DAO2" => DAO2 
    case _ => throw new IllegalArgumentException("invalid table") 
    } 
} 

然而,編譯器告訴我,無論是DAO1,也不DAO2匹配這種類型。這種方法的正確返回類型是什麼?

回答

1

使用你的getTable的第一個定義(沒有try)在REPL中鍵入getTable2的定義,你將得到你需要的返回類型。

def getTable2(table: String) = Try { getTable(table) } 

那就是:Try[SuperTable[_1] forSome { type _1 >: Record1 with Record2 <: SuperRecord}]

相關問題