2016-12-28 39 views
3

的我想写这样的代码:斯卡拉类扩展与通用性状这是一个类型的字段

trait A[S] 
class B { 
    class BI 
} 
class C(val b: B) extends A[b.BI] // won't compile 

这将无法编译。 所以我写这个:

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 = {} 
} 

我不想使用CarFactory#Car,因为这款车店只卖工厂factory的汽车。

+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

我不明白你的问题:) –