Scala 2.9 Бридж-метод - PullRequest
       39

Scala 2.9 Бридж-метод

6 голосов
/ 04 ноября 2011

Я использую Scala 2.9.1

Я определил черту Logging так:

 trait Logging {
    def debug(msg: String, throwables: Throwable*) = ....
    ....
 }

И у меня есть класс JMSPublisher, который смешивает черту Logging:

 class JMSPublisher extends Publisher with Logging {
    def publishProducts(list: List[_ <: Product]) = ....
    def publish(list: Seq[Product]) = ....
 }

Все это прекрасно компилируется.Моя проблема в том, что у меня есть пользователь, который хочет загрузить мой JMSPublisher в Spring.Он использует Spring 2.5.6.

Когда ApplicationContext загружается во время запуска, приложение аварийно завершает работу с IllegalStateException, жалуясь, что не может найти bridged-метод, связанный с моей чертой Logging.*

Этот код работал в Scala-2.8, и я слышал, что Scala помечает черты, которые имеют некоторые методы, соединенные в 2.9.Я думаю, что это то, что заставляет Spring терпеть неудачу.Я не могу перейти на Scala-2.9, если Spring не может загрузить мой класс.

Кто-нибудь сталкивался с этой проблемой?Есть ли какое-либо исправление или обходной путь?

1 Ответ

3 голосов
/ 07 ноября 2011

Мы видели то же самое. Я так и не понял, какие изменения произошли в Scala 2.9.x, но я думаю, что настоящая проблема связана с самой Spring.

Когда вы смешиваете признак в классе, в класс добавляются синтетические методы, помеченные в байт-коде как методы моста , которые направляют реализацию метода в признаке.

Java также добавляет методы-мосты к классам, когда подкласс переопределяет метод в суперклассе или интерфейсе, но уточняет тип возвращаемого значения. Поскольку возвращаемый тип является частью сигнатуры метода на уровне байт-кода, необходим метод пересылки, чтобы клиенты, которые знают только сигнатуру родительского метода, могли по-прежнему вызывать метод в подклассе. (Подробнее: для чего используется java.lang.reflect.Method.isBridge ()? )

Spring проверяет байт-код для методов моста по причинам, описанным в статье A Too Far . Название этой статьи иронично - Spring называет это «прекрасным примером того, как Spring решает проблемы с жесткой инфраструктурой, с которыми сталкиваются разработчики Java, и интегрирует их в стек приложений», но делает слишком много предположений об источнике байт-кода и хуже, не может быть отключен.

Краткосрочный обходной путь - избегать смешения черт с классами, которые вы используете в Spring. Вы должны сообщить об ошибке в Spring, чтобы позволить вам отключить эту проверку для байт-кода не-Java.

...