Использование псевдонимов типов Scala из кода Java

Предположим, у меня есть псевдоним типа, определенный в scala как

object Foo {
  type Bar = Option[String]
}

Похоже, я не могу ссылаться на псевдоним в коде Java таким образом (он просто жалуется не может найти символ):

import Foo.*;

public class Cafebabe {
  void bar(Bar x) {
  //...
  }
}

Я также пробовал статический импорт.

(В частности, у меня есть код отражения Java, который я не могу изменить, которому нужно знать тип параметра, и мне нужно передать ему псевдоним Bar).

Я знаю, я могу создать обертку в Scala

class BarWrapper(value: Bar)

но, может быть, я пропускаю какой-то другой путь?


person om-nom-nom    schedule 02.12.2012    source источник


Ответы (1)


Псевдонимы типов видны только компилятору Scala, и, подобно универсальным типам, они нигде не появляются в файлах классов JVM.

Если вы работаете с Java, вы застряли с использованием типа Option[String] без псевдонима, поскольку javac не может узнать о псевдониме типа Bar, который вы объявили в коде Scala. Везде, где вы бы использовали Bar, просто используйте Option[String] (который в Java равен scala.Option<String>), и все должно работать нормально.

person DaoWen    schedule 02.12.2012
comment
Введите псевдонимы должны появляться где-нибудь в файлах классов JVM, иначе вы не сможете использовать псевдонимы из других библиотек. Но, насколько я понял, они зашифрованы в каком-то дополнительном поле данных в определении класса. - person Keros; 07.05.2013
comment
@Keros - это хороший момент, но по той же логике информация о подписи универсального типа также включается в файлы классов в некотором формате. Какой бы формат они ни использовали при компиляции объявлений типов, к сожалению, это не то, что распознает Java. - person DaoWen; 08.05.2013