Я столкнулся с какой-то странной ситуацией в Scala сегодня, в то время как я попытался уточнить границы типов для элемента абстрактного типа.Scala Элементы абстрактного типа - наследования и ограничения типов
У меня есть две черты, которые определяют границы элемента типа и объединяют их в конкретном классе. Это отлично работает, но при согласовании/литья с комбинацией признака только один из двух TypeBounds является «активным», и я изо всех сил, чтобы понять, почему ...
Я попытался подготовить пример:
trait L
trait R
trait Left {
type T <: L
def get: T
}
trait Right {
type T <: R
}
прямо сейчас если объединить эти две черты в одном конкретном классе
val concrete = new Left with Right {
override type T = L with R
override def get: T = new L with R {}
}
я могу получить доступ к члену через ГЭТ по назначению
// works fine
val x1: L with R = concrete.get
, но если я набрал (слева направо) или совпадение с образцом, я больше не могу получить доступ к элементу. В зависимости от порядка я получаю либо границы типа слева, либо справа, но не комбинацию обоих.
// can only access as R, L with R won't work
val x2: R = concrete.asInstanceOf[Left with Right].get
// can only access as L, L with R won' work
val x3: L = concrete.asInstanceOf[Right with Left].get
Я понимаю, что левый с права не то же самое, что и правое с левым, но в обоих случаях обе границы типа включены, так почему я могу получить только один работать?
может кто-нибудь пролить свет на то, почему это происходит?
Вы можете узнать больше о том, почему теперь scala переопределяет типы и как это можно сделать по-другому в этой концепции для следующего поколения scala http://www.cs.uwm.edu/~boyland/fool2012/papers/fool2012_submission_3.pdf – Odomontois
I haven У меня было время погрузиться в точку, но я определенно с нетерпением жду этого! –
Вы можете увидеть немного о будущем awesomeness в этом видео https://www.youtube.com/watch?v=WxyyJyB_Ssc. Замечания о бесформенном включены – Odomontois