Точечная запись .
может использоваться только в том случае, если идентификатор слева относится к значению , в противном случае мы должны использовать проекцию типа га sh #
обозначения, подобные таким
case _: Outer#Inner =>
Сравните следующий синтаксис
val outer = new Outer
(outer.a: Any) match {
case _: outer.Inner => "<value>.<type>"
case _: Outer#Inner => "<type>#<type>"
}
Следующие отношения подтипов зависимых от пути типов заслуживают внимания
import shapeless.=:!=
class Outer {
class Inner
}
val outerX: Outer = new Outer
val outerY: Outer = new Outer
val innerX: outerX.Inner = new outerX.Inner
val innerY: outerY.Inner = new outerY.Inner
// val innerZ: Outer#Inner = new Outer#Inner // error: Outer is not a legal prefix for a constructor
val innerZ: Outer#Inner = new outerX.Inner
implicitly[Outer#Inner =:= Outer#Inner]
implicitly[outerX.Inner <:< Outer#Inner]
implicitly[outerY.Inner <:< Outer#Inner]
implicitly[outerX.Inner =:!= outerY.Inner]
// implicitly[innerZ.Inner =:= outerX.Inner] // error: type Inner is not a member of Outer#Inner