在搜索编译问题的一系列随机重构之后,我找到了一个非常简洁的例子,看起来它应该编译但不是:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
用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
它应该像这样,一个bug,还是一个完全阴暗的区域?看起来我必须根据编译器接受它的方式在各种特性之间调整代码,而不是从设计的角度来看它是有意义的。
答案 0 :(得分:0)
我提交了一个问题:https://issues.scala-lang.org/browse/SI-9469 它已被接受为现有错误的副本(原因,无效),因此可能会在某些时候修复。