Я только что начал экспериментировать с API-интерфейсом отражения, представленным в Scala 2.10, и ожидал, что код ниже будет оцениваться в пять раз (REPL).Scala reflection с TypeTags и одноточечными типами
К сожалению, действительно действительно только первое и последнее выражения. Может кто-нибудь объяснить, почему это так? Кажется, с точки зрения компилятора все эти сравнения типов одобрены или я ошибаюсь?
Есть ли способ сделать это (хотя бы один .type
сравнение) работа?
import scala.reflect.runtime.universe._
class Test[A:TypeTag](val a:A) {
val value:this.type=this
def t1:TypeTag[Test[A]]=typeTag[Test[A]]
def t2:TypeTag[this.type]=typeTag[this.type]
def t3:TypeTag[_<:Test[A]]=typeTag[this.type]
}
val a:Test[String]=new Test("a")
a.t1.tpe<:<typeOf[Test[String]] //works as expected
a.t2.tpe<:<typeOf[Test[String]] //FAILS
a.t3.tpe<:<typeOf[Test[String]] //FAILS
a.t2.tpe<:<typeOf[a.type] //FAILS
typeOf[a.type]<:<typeOf[a.type] //this works again
Протестировано с помощью Scala REPL 2.10.3 и 2.11.0-M7.
С уважением,
Месси
Но разве это не так, что ваш пример также «не прошел статически» (val a: c2.type = c1)? Ваше решение, к сожалению, не то, что я искал, так как это было именно то, чего я хотел избежать: передавать информацию о типе со стороны. Цель была своего рода «неотъемлемо овеществленным» классом, т. Е. Который содержит информацию о своем типе). – messi
@messi Да, извините, я не поймал все вопросы в вашем вопросе. Но я думаю, что факт по-прежнему остается фактом, что объект не может нести свою информацию типа _singleton_, поскольку он зависит от контекста, в котором используется этот объект. – ghik