Проблема Scala с доступом к методам Java

#java #scala #interop

#java #scala #взаимодействие

Вопрос:

Итак, у меня есть кое-что, написанное на Java, и я хочу расширить это в Scala… Проблема, с которой я сталкиваюсь, заключается в том, что Scala не видит нужные мне методы.

Вот как это настроено: Player расширяет Mob, а Mob расширяет Entity.

Мне нужно получить доступ к методу в Player, который не определен в Mob или Entity, но Scala не считает, что он существует, хотя Java это делает.

Он отлично видит методы, определенные Mob и Entity. Кроме того, все методы, о которых я говорю, нестатичны.

Итак, я делаю что-то неправильно, или это ограничение, наложенное Scala?

Редактировать — Вот соответствующий код:

 package test

import rsca.gs.model.Player

object Test {
     def handle(p:Player): Unit = {
         p.getActionSender().sendTeleBubble(0, 0, false);
     }
}
  

Класс проигрывателя:

 package rsca.gs.model;        
    // imports        
public final class Player extends Mob {
        //  Implemented methods (not going to post them, as there are quite a few)    
        // Relevant code
        private MiscPacketBuilder actionSender;
        public MiscPacketBuilder getActionSender() {
        return actionSender;
    }
}
  

Ошибка:
значение getActionSender не является членом rsca.gs.model.Игрок

Комментарии:

1. Опубликовал некоторые, но интервал был искажен. Извините за это.

2. И что Scala не может увидеть getActionSender() или sendTeleBubble(0, 0, false); ?

3. О, и глупый вопрос, но находятся ли Player, Mob и Entity в пути к классу?

4. Мы хотели бы видеть вашу командную строку для компиляции, а также код ошибки в полном, красивом виде. Спасибо.

5. @RandomGuy12345, не могли бы вы запустить интерпретатор scala, указывающий на ваш jar, и посмотреть, сможете ли вы создать объект типа Player и вызвать его метод? scala -classpath your.jar

Ответ №1:

Я никогда не сталкивался с подобными проблемами, и вы, вероятно, дважды проверяли свою конфигурацию и все остальное, поэтому я бы предположил, что это какая-то проблема, связанная с Eclipse при сборке. Вы должны попытаться выполнить сборку из командной строки, чтобы увидеть, является ли проблема Scala или Eclipse.

Ответ №2:

Возможно ли для вас запустить тест против класса, просто чтобы убедиться, что вы получили правильный?

 p.getClass.getMethods
  

… и, если возможно (может столкнуться с NPE), чтобы найти источник:

 p.getClass.getProtectionDomain.getCodeSource.getLocation.getPath
  

Ответ №3:

При компиляции класса Scala сделайте что-то вроде этого:

 scalac *.scala *.java
  

Таким образом, Scala просмотрит Java-код, чтобы увидеть, что доступно. Однако, если код Java уже скомпилирован и предоставлен в виде файла jar, просто добавьте его в classpath, используемый при компиляции кода Scala.

Комментарии:

1. Это не исправляет проблему, и Eclipse отлично с этим справляется. В Eclipse нет ошибок, указывающих на то, что не удалось добавить его в classpath и т.д.

2. @RandomGuy Ох… Eclipse … в Eclipse есть ошибки. Я бы посмотрел потоки Eclipse.