1

次のようないくつかの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このメソッドの正しい戻り値の型は何ですか?

4

1 に答える 1

1

getTable の最初の定義 (try なし) を使用して、REPL で getTable2 の定義を入力すると、必要な戻り値の型が得られます。

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

それは次のとおりです。 Try[SuperTable[_1] forSome { type _1 >: Record1 with Record2 <: SuperRecord}]

于 2013-09-27T00:14:31.047 に答える