2016-08-30 1 views
0

In Java können wir nur und Beschränkung gelten wie diese gebunden Typ:Gibt es eine Möglichkeit, OR anzuwenden, um gebunden in Scala zu schreiben?

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

Aber wir konnten nicht sagen, Java OR Beschränkung zu halten.

Ist es in Scala möglich, eine Einschränkung zu schaffen, die es möglich wäre, ein Element in einer Sammlung hinzuzufügen iff es ist vom Typ SomeType1ORSomeType2

+0

planen Sie später mit instanceof zu überprüfen? – Ven

+0

@Ven Muster – user3663882

+0

in Ordnung, so Instanceof entsprechen. Works, so lange sind Sie sich bewusst Typ Löschung – Ven

Antwort

1

Sie können nicht wirklich tun das mit garantierter Sicherheit.

Ich meine, Sie könnten einfach eine instance tun und einen Fehler werfen, wenn die Klasse instanziiert wird, aber das ist ziemlich dreckig.

Die viel bessere Lösung ist ADT (Abstrakte Datentypen) zu verwenden:

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" 
    } 
} 

Welche exhaustivity Überprüfung ergibt:

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

Ich würde vorschlagen, so etwas wie coproducts

Sie sich auch Beachten Sie, dass Dotty AND/OR-Einschränkungen für Typen haben wird.

0

gibt es kein Sprachniveau Konstrukt, das dies genau unterstützt, aber als @dveim weist darauf hin, ich glaube, das wird bald kommen.

, wenn Sie mit einem bestimmten praktischen Anwendungsfall im Auge fragen, haben Sie allerdings einige Optionen ein. Sie könnten Either[SomeType1, SomeType2] verwenden, das alle Konstrukte enthält, die Sie benötigen, um diese Idee zu repräsentieren (aber keine typgebundene).

alternativ können Sie diesen Effekt mit typeclasses erreichen:

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) 

} 

bitte die triviale Beispiel entschuldigen, aber was man bekommt, ist hier:

  • ein sealed trait was bedeutet, können Sie andere beschränken aus mehr Instanzen der Or Familie Zugabe (sofern sie nicht die eigentliche Datei bearbeiten können es in definiert ist)
  • eine gut getippt Art und Weise zu bestimmen, welche Funktionen, die Sie haben wollen ha Anh in den zwei verschiedenen Fällen
Verwandte Themen