0
一系列的随机refactors后对周围的工作编译问题的搜索时提出,我发现的东西,看起来像它应该编译,但没有一个很简洁的例子:斯卡拉泛型应该与路径依赖型参数一起工作吗?
trait SubtypeOf[+T] {
type Type <: T
}
def SubtypeOf[T] :SubtypeOf[T] = new SubtypeOf[T] { type Type = T }
class InVar[T]
trait Module {
type This = this.type
val X = SubtypeOf[AnyRef]
type X = X.Type
val arg :InVar[Option[This#X]]
def fail[M<:Module](arg :InVar[Option[M#X]]) = ???
fail[This](arg) //error, although there's a 1-1 term substitution!
}
代val X=...
和type X=...
与一个抽象声明type X
使它编译。更有趣的是,下面也编译:
trait Module {
type This = this.type
type X
val arg :InVar[Option[This#X]]
def fail[M<:Module](arg :InVar[Option[M#X]]) = ???
fail(arg)
}
trait BaseModule extends Module {
val X = SubtypeOf[AnyRef]
type X = X.Type
}
它应该像这样工作,一个错误,或完全阴暗的区域?看起来我不得不在编译器接受它的地方扩展各种特征之间的代码,而不是从设计的角度来看它有意义。