scala泛型是否应该使用与路径相关的类型参数?

时间:2015-09-07 00:27:51

标签: scala generics path-dependent-type

在搜索编译问题的一系列随机重构之后,我找到了一个非常简洁的例子,看起来它应该编译但不是:

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,还是一个完全阴暗的区域?看起来我必须根据编译器接受它的方式在各种特性之间调整代码,而不是从设计的角度来看它是有意义的。

1 个答案:

答案 0 :(得分:0)

我提交了一个问题:https://issues.scala-lang.org/browse/SI-9469 它已被接受为现有错误的副本(原因,无效),因此可能会在某些时候修复。