У меня есть зависимая от пути черта, объявляющая несколько модулей. Это нормально. Тем не менее, я пишу макрос, и мне нужно получить доступ к этим внутренним типам, и я не могу написать правильное выражение, выбирающее их.Проекция типа Scala: выберите объект в зависимом от пути значении
trait A {
type Foo
object module { // one of modules encapsulating functionality
class Bar // I use it as an annotation depending on Foo but that is irrelevant
}
class Other
}
Теперь мне нужно написать правильное выражение типа выбором Bar
класса для извлечения его weakTypeTag
. Я могу написать weakTypeOf[ A#Other ]
, чтобы выбрать класс Other
. Но когда я пытаюсь выбрать Bar
, он не работает. Я пробовал:
A#module.Bar
A#module#Bar
A#module.type.Bar
A#module.type#Bar
Все это терпят неудачу в выборе module
.
Почему это не работает и как они работают? Благодарю.
Спасибо, большой ответ! Так что в принципе, с 'A # module.type # Bar' я был прав. Он просто не работает таким образом, поскольку отсутствует что-то вроде круглых скобок, не так ли? Вот почему я должен явно определять псевдоним типа, не так ли? (принять и +1) – Gaim
Это хорошее наблюдение. AFAIK вообще, тип проекции не равен экзистенциальному типу. Учитывая вашу иерархию, 'неявно [A # Other =: = (a.Other forSome {val a: A})] дает ошибку. Хотя 'A # Inner' выглядит как проекция типа, на самом деле он представляет собой экзистенциальный тип, и выполняется равенство. – 4e6