我有以下代码:
trait TFn1B {
type In
type Out
type Apply[T <: In] <: Out
}
trait TFn1[I, O] extends TFn1B {
type In = I
type Out = O
}
trait >>[F1 <: TFn1[_, _], F2 <: TFn1[_, _]] extends TFn1[F1#In, F2#Out] {
type Apply[T] = F2#Apply[F1#Apply[T]]
}
它在 Scala 2.9.1 上编译,没有警告或错误。
但是在当前的 2.10 版本中,我收到以下错误消息:
Fun.scala:12: error: illegal inheritance;
self-type this.>>[F1,F2] does not conform to this.TFn1[_$1,_$4]'s selftype this.TFn1[_$1,_$4]
trait >>[F1 <: TFn1[_, _], F2 <: TFn1[_, _]] extends TFn1[F1#In, F2#Out] {
^
one error found
这是回归还是代码不健全并且编译器最近才开始捕获它? 如果代码错误,有什么解决方法可以使其再次工作?
如 Scala 邮件列表(由您发布)所示,Paul Phillips 回答:
已经开放(SI-5399,SI-5400)。
回归源于尝试解决 SI-5120:抽象类型的相当惊人的健全性失败。
潜在有问题的提交:
对我来说这看起来像是一个错误。超类的类型参数没有限制,但是,更重要的是,
-explaintypes
的跟踪对我来说看起来很可疑:
scala> trait >>[F1 <: TFn1[_, _], F2 <: TFn1[_, _]] extends TFn1[F1#In, F2#Out] {
| type Apply[T] = F2#Apply[F1#Apply[T]]
| }
<console>:9: error: illegal inheritance;
self-type >>[F1,F2] does not conform to TFn1[_$1,_$4]'s selftype TFn1[_$1,_$4]
trait >>[F1 <: TFn1[_, _], F2 <: TFn1[_, _]] extends TFn1[F1#In, F2#Out] {
^
>>[F1,F2] <: TFn1[_$1,_$4]?
TFn1[_$1,_$4] <: TFn1[_$1,_$4]?
_$1 <: _$1?
_$1 <: Nothing?
<notype> <: Nothing?
false
Any <: Nothing?
<notype> <: Nothing?
false
false
false
Any <: _$1?
Any <: Nothing?
<notype> <: Nothing?
false
false
false
false
false
false
具体来说,我不明白它如何或为什么不能证明
TFn1[_$1,_$4] <: TFn1[_$1,_$4]
甚至_$1 <: _$1
。