2016-12-28 7 views
3

のタイプであるジェネリックとの形質を拡張します。 だから私はこの書き込み:Scalaのクラスは、私はこのようなコードを書きたいフィールド

class C[BI0] private (val b: B) extends A[BI0] 
object C { 
    def apply(b: B): C[b.BI] = new C(b) 
} 

をしかし、それは醜いです。より良い実装がありますか?

なぜこの質問がありますか?私は例を思いつく:

trait Store[Goods] { 
    def sell(goods: Goods): Unit 
} 
class CarFactory { 
    def make(): Car = new Car 
    class Car 
} 
class CarStore(val factory: CarFactory) extends Store[factory.Car]{//can't compile 
    def sell(car: factory.Car): Unit = {} 
} 

私はこの車店のみ工場factoryの車を売るためCarFactory#Carを使用する必要はありません。

+0

「BI0」とは何ですか?具体的なタイプですか? –

+0

@YuvalItzchakov「C2」の型パラメータの名前だと思います... –

+0

私は 'BI0'を' b.BI'型にします。 –

答えて

2

私は良い方法はないと思います。あなたが持っているのは、クラス宣言でパスに依存する型を使用して作業する、かなり標準的な方法です。代わりに、タイプメンバーを使用することができます:

trait A { type S } 

class B { class BI } 

class C(val b: B) extends A { type S = b.BI } 
+0

ああ!それは良く見える。どうもありがとうございました! –

0

ここで何をしようとしているのかよく分かりませんが、これはあなたのために機能しますか?

trait A[S] 
class B { 
    class BI 
} 
class C(val b: B) extends A[B#BI] 
+0

あなたの答えをありがとう。私はこのトリックを知っている。しかし、私は 'B#BI'だけでなく、パス依存型' b.BI'が必要です。 –

+0

私はあなたの質問を理解していない:) –

関連する問題