2017-11-13 19 views
1

以下のメソッドでは、 にfromtoの型が同じ型のLexicalDateであるように関数の型を設定したいと考えていました。私。両方ともDayであるか、両方ともHourである必要があります。多型パラメーターを同じ型にすることを強制する

現在、fromtoは異なる種類のLexicalDateとして渡すことができます。

fromtoはコンパイルレベルで強制的に同じタイプのLexicalDateにすることができますか?あなたが探しているものを

sealed trait LexicalDate 
case object Day extends LexicalDate 
case object Hour extends LexicalDate 
def queryDate[Date <: LexicalDate](
    id: Long, 
    from: Date, 
    to: Date 
) 
+1

。あなたがこれを必要とする唯一の時間は、実装が[Liskov Substitution Principle](http://www.oodesign.com/liskov-s-substitution-principle.html)(私が思う)を破り、お互いに。興味深い考え。 – byxor

+0

あなたの質問は何ですか?ところで、あなたの宣言は 'CaseオブジェクトHourはLexicalDateを拡張する' 'Case objects Hour extends'だけではなく、あなたの問題であったのですか?) –

答えて

3

は、コンパイラは二つのタイプが同じであることを証明することができなければならないことを要求する一般的なタイプの制約=:=、です。

    scala> def queryDate[A <: LexicalDate, B <: LexicalDate](id: Long, from: A, to: B)(implicit ev: A =:= B) { } 
    queryDate: [A <: LexicalDate, B <: LexicalDate](id: Long, from: A, to: B)(implicit ev: A =:= B)Unit 
    
    scala> queryDate(10, Day, Day) 
    
    scala> queryDate(10, Hour, Hour) 
    
    scala> queryDate(10, Day, Hour) 
    <console>:15: error: Cannot prove that Day.type =:= Hour.type. 
         queryDate(10, Day, Hour) 
           ^
    
    scala> queryDate(10, Hour, Day) 
    <console>:15: error: Cannot prove that Hour.type =:= Day.type. 
         queryDate(10, Hour, Day) 
           ^
    

    は一般型制約の一般的な説明については、以下のリンクを参照してください:あなたのケースのために、=:=は(特に、queryDate方法の暗黙のパラメータリストを注意してください)以下のように使用することができます私はこれを行うにはどのような理由を見ることができません

  • What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?
  • Generalized type constraints in Scala (without a PhD)
+0

これは素晴らしいことです!この欠点の1つは、queryDateという名前のものを呼び出す場合、この型チェックは直接呼び出すときにのみ機能するように見えるということです。 – Scalahansolo

関連する問題