#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.