2015-09-07 63 views
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 
} 

它应该像这样工作,一个错误,或完全阴暗的区域?看起来我不得不在编译器接受它的地方扩展各种特征之间的代码,而不是从设计的角度来看它有意义。

回答