Можно ли проверить, является ли класс значения внутреннего типа класса - PullRequest
0 голосов
/ 07 января 2020

Есть ли способ проверить, является ли класс значения внутренним классом? Скажем, у меня есть следующее:

trait A {
}

class Outer {
    class Inner extends A {
    }

    val a: A = new Inner
}

val outer = new Outer

Тогда я могу проверить, имеет ли значение 'a' тип Inner? Так что я могу сделать что-то вроде ниже (что, конечно, не скомпилируется):

outer.a match {
    case _: Outer.Inner =>
}

1 Ответ

1 голос
/ 07 января 2020

Точечная запись . может использоваться только в том случае, если идентификатор слева относится к значению , в противном случае мы должны использовать проекцию типа га 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...