2016-08-24 66 views
1

可以這樣做嗎?Foo [T]到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 

應該允許任何類型T,只要雙方Foo#TBar#T是相同的。

+2

一個'Map'本身不會讓你強制執行約束,因爲'Map'接受兩個完全獨立的類型參數。你可以定義一個包裝類(圍繞'Map'),它將採用一個單一的類型參數(對於底層'Map'的鍵和值)。 – Jubobs

+0

@Jubobs看起來我必須這樣做。我只是希望有一個更好的方法來做到這一點,因爲我將純粹出於類型約束的目的創建一個子類。 –

回答

1

你可以嘗試這樣的事情,迫使Foo的和BarT類型參數是相同的:

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

感謝您的回覆!問題在於我正在使用提供'Foo [_]'的框架,該框架已經在另一個上下文中依賴於路徑。將它包裝在另一課中會讓事情變得複雜。 –

相關問題