2016-08-30 4 views
0

は、Javaでは、我々は唯一の、制限次のようにバインドタイプに適用することができます。ORをScalaにバインドするために適用する方法はありますか?

public class <T extends Serializable & SomeThingDoable> MyClass{ 
    //... 
} 

しかし、我々はOR制限を保持するためのJavaを伝えることができませんでした。

は、それはあなたが本当にやることができないタイプのSomeType1ORSomeType2

+0

は後でinstanceofを使用しチェックすることを計画していますか?そうinstanceofは、 – Ven

+0

@Venパターン。作品なので、限り、あなたは型消去 – user3663882

+0

は大丈夫マッチング – Ven

答えて

1

だ場合に限っコレクションに要素を追加することも可能であろう制限を提供するために、Scalaで可能ですタイプセーフティを保証します。

は、私はあなただけinstanceを行い、クラスをインスタンス化するときにエラーを投げることができ、意味、それはかなり汚いです。

はるかに優れたソリューションは、ADT(抽象データ型)を使用することです:

網羅性チェックを与える
sealed trait NaturalNumber 
final case class Zero() extends NaturalNumber 
final case class Next(i: NaturalNumber) extends NaturalNumber 


object Main extends App { 
    val a: NaturalNumber = Next(Zero()) 
    a match { 
     case Zero() => "zero" 
    } 
} 

<console>:16: warning: match may not be exhaustive. 
1

私はまたcoproducts

のようなものを使用してお勧めしたいですDottyには型のAND/ORビルトイン制限があることに注意してください。

0

がまさにこれをサポートしています何の言語レベル構築物はありませんが、@dveimが指摘するように、私はこれがすぐに来ていると信じています。

あなたは心の中で特定の実用的なユースケースを求めているならば、あなたはしかし、いくつかのオプションを持っています。 Either[SomeType1, SomeType2]を使用できます。これには、このアイデアを表現するために必要なすべての構造が含まれています(ただし、タイプバインディングではありません)。

代わりに、あなたは型クラスを使用してこの効果を実現することができます

sealed trait Or[T] { 
    def someMethod(t: T): String 
} 

object Or { 
    implicit object OrInt extends Or[Int] { 
    def someMethod(t: Int): String = "int" 
    } 

    implicit object OrLong extends Or[Long] { 
    def someMethod(t: Long): String = "long" 
    } 
} 

object Test { 

    import Or._ 

    def test[T](value: T)(implicit or: Or[T]): String = 
    or.someMethod(value) 

} 

は、簡単な例を言い訳が、何あなたがここに来ることですしてください。

  • あなたが他の人を制限することができることを意味し、sealed traitOrファミリにインスタンスを追加します(実際に定義されているファイルを編集できない場合)
  • どのような機能を持たせたいのかを明確に指定する方法ppen二つの異なる例で
関連する問題