2013-09-26 24 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}]

相关问题