我想写这样的代码:
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 :(得分:2)
我认为没有比这更好的方法了。你所拥有的是一种在类声明中使用路径依赖类型的相当标准的方法。或者,您可以使用类型成员:
trait A { type S }
class B { class BI }
class C(val b: B) extends A { type S = b.BI }
答案 1 :(得分:0)
我不完全确定你在这里做什么,但这对你有用吗?
trait A[S]
class B {
class BI
}
class C(val b: B) extends A[B#BI]