2016-08-24 1 views
1

Kann dies getan werden?Karte von Foo [T] zu Bar [T]

case class Foo[T](value: T) 
case class Bar[T](value: T) 

val map = mutable.Map.empty[Foo[_], Bar[_]] 

map(Foo(1)) = Bar(1) // correct 
map(Foo(1)) = Bar(1.1) // should cause a compiler error 

Es jede Art T, so lange erlauben sollte, da beide Foo#T und Bar#T gleich sind.

+2

A 'Map' allein wird nicht zulassen, dass die Einschränkung zu erzwingen, weil 'Map' nimmt zwei Typparameter, die völlig unabhängig sind. Sie könnten eine Wrapper-Klasse (um eine 'Map') definieren, die einen einzigen Typparameter (sowohl für die Schlüssel als auch für die Werte der zugrunde liegenden' Map') benötigt. – Jubobs

+0

@Jubobs Es sieht so aus, als müsste ich das tun. Ich habe nur auf eine bessere Möglichkeit gehofft, dies zu tun, da ich eine Unterklasse von etwas rein für den Zweck von Typenzwängen machen werde. –

Antwort

1

Man könnte so etwas wie diese versuchen, zu zwingen Foo ‚s und Bar‘ s T Typ Parameter gleich zu sein:

object Maps extends App { 

    import scala.collection.mutable 

    class C[T] { 
    case class Foo(value: T) 
    case class Bar(value: T) 
    } 

    val c = new C[Int]  
    import c._ // now Foo and Bar refer to c's types c.Foo and c.Bar 

    val map = mutable.Map.empty[Foo, Bar] 

    map(Foo(1)) = Bar(1) // correct 
    map(Foo(1)) = Bar(1.1) // should cause a compiler error, and it does 

} 
+0

Danke für die Antwort! Das Problem dabei ist, dass ich ein Framework verwende, das 'Foo [_]' bereitstellt, das bereits pfadabhängig von einem anderen Kontext ist. Es in einer anderen Klasse zu verpacken würde die Dinge wirklich komplizieren. –

Verwandte Themen