2015-10-20 5 views
2

У меня есть проект scala, который генерирует банку. Я пытаюсь использовать банку в проекте Java. Странно, что сигнатуры метода теряют информацию о типовом типе, когда они скомпилированы в файлы .class.Scala Removing Generic Type Information

def foo(x:List[Long]) = ... 

генерирует метод с
Lscala/collection/immutable/List<Ljava/lang/Object;>
в его файле .class.

Это то же самое с

def foo(x:java.util.List[Long]) = ... 

в файл .class говорит метод подписи
Ljava/util/List<Ljava/lang/Object;>

Реальная проблема заключается в том, что, когда я использую эту банку в проекте Java я должен использовать List<Object> вместо List<Long>, как я хочу. Конечно, я могу бросить его, но мне бы этого не хотелось. Есть идеи?

Я использую SCALA версию 2.11.7

ответ

5

Если вы хотите, чтобы ваш метод быть отозван из Java в том, что вы хотите, вы должны объявить его принять List[java.lang.Long].

Почему? Ну, scala.Long является эквивалентом Java long, а не java.lang.Long Java. И в системе типа Java параметры типа могут не относиться к примитивным типам, а только к ссылочным типам. Поэтому Scala не может исправить «правильную» подпись и вынуждена вернуться к java.lang.Object.

(В очень старых версиях Scala вместо этого он вместо этого возвращался на java.lang.Long, но, к сожалению, это фактически не 100% -ное правильное решение и вызвало множество проблем с подключением. См. https://issues.scala-lang.org/browse/SI-4214 для подробностей gory. не знаю более сжатой записи. Это происходит довольно часто, поэтому, если есть такая запись, я хотел бы узнать об этом.)

+0

О, конечно! Спасибо! – Tim

+0

Это хорошая идея рассмотреть возможность использования 'Array [Long]', поскольку это будет переведено на 'long []' в Java. Конечно, это не всегда возможно, но это делает стороны Java и Scala сторонными, выглядящими хорошими и без уродливых подписей – Archeg

 Смежные вопросы

  • Нет связанных вопросов^_^