次のようないくつかのDAO(Slickを使用)があります
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")
}
}
これでSuccessを解凍すると、Serializableが得られるので、型推論エンジンを支援しようとしています
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
このメソッドの正しい戻り値の型は何ですか?