は、Javaでは、我々は唯一の、制限次のようにバインドタイプに適用することができます。ORをScalaにバインドするために適用する方法はありますか?
public class <T extends Serializable & SomeThingDoable> MyClass{
//...
}
しかし、我々はOR制限を保持するためのJavaを伝えることができませんでした。
は、それはあなたが本当にやることができないタイプのSomeType1
ORSomeType2
は、Javaでは、我々は唯一の、制限次のようにバインドタイプに適用することができます。ORをScalaにバインドするために適用する方法はありますか?
public class <T extends Serializable & SomeThingDoable> MyClass{
//...
}
しかし、我々はOR制限を保持するためのJavaを伝えることができませんでした。
は、それはあなたが本当にやることができないタイプのSomeType1
ORSomeType2
だ場合に限っコレクションに要素を追加することも可能であろう制限を提供するために、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.
私はまたcoproducts
のようなものを使用してお勧めしたいですDottyには型のAND/ORビルトイン制限があることに注意してください。
がまさにこれをサポートしています何の言語レベル構築物はありませんが、@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 trait
Or
ファミリにインスタンスを追加します(実際に定義されているファイルを編集できない場合)
は後でinstanceofを使用しチェックすることを計画していますか?そうinstanceofは、 – Ven
@Venパターン。作品なので、限り、あなたは型消去 – user3663882
は大丈夫マッチング – Ven