Ошибка связанного типа при создании кортежа в Scala - PullRequest
0 голосов
/ 26 февраля 2019

Скажем, у меня есть тип

trait Mode[T]
trait MyType[T, M <: Mode[T]]

Это компилируется

val t: MyType[_, _] = ???
t

Но не этот

val t: MyType[_, _] = ???
"some_string" -> t

Ошибка говорит что-то вроде type arguments [_$0,_$1] do not conform to trait MyType's type parameter bounds

Итак, мой вопрос заключается в том, почему это не компилируется при создании кортежа?

1 Ответ

0 голосов
/ 26 февраля 2019

На самом деле и t, и "some string" -> t сломаются во время выполнения с одной и той же проблемой:

import scala.language.existentials
import scala.reflect.runtime.universe._

type SubMode[T] = M forSome { type M <: Mode[T] }

val t: MyType[_, _] = new MyType[String, SubMode[String]] {}
// t: MyType[_, _] = $anon$1@596afb2f

"some string" -> t
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

reify(t)
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

reify("some string" -> t)
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

На самом деле, проблема во время компиляции не является специфичной для кортежей.Например:

List(t)
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

Я предполагаю, что хотя само по себе определение t не приводит к ошибке компиляции, дополнительное «прикосновение» к t может привести к.Все будет работать нормально, если вы позволите компилятору выводить правильный тип:

val t2 = new MyType[String, SubMode[String]] {}
t2: MyType[String,SubMode[String]] = $anon$1@19d53ab4

"some string" -> t2
// res1: (String, MyType[String,SubMode[String]]) = (some string,$anon$1@19d53ab4)

List(t2)
// res2: List[MyType[String,SubMode[String]]] = List($anon$1@19d53ab4)
...