Подтвердить что ты не робот

Могу ли я создать метод с защищенным доступом Java в Scala?

У меня есть класс Java, который я портировал на Scala, но у которого все еще есть некоторые подклассы Java, реализующие абстрактные функции.

Оригинальная Java имела

public abstract class Base {
    ...
    protected abstract Foo getFoo();
}

который был расширен

public class Fred extends Base {
    ...
    protected Foo getFoo() {
        return foo;
    }
}

Теперь, когда я устанавливаю Base на Scala

class Base {
    ...
    protected def getFoo(): Foo
}

Компилятор жалуется, что

Невозможно уменьшить видимость унаследованного метода...


Теперь я понимаю, что, поскольку его правила тонко отличаются друг от друга, Scala имеет тенденцию обеспечивать видимость в компиляторе, а не байт-код, так что getFoo помечен как public в классе javap'd. Но

protected[packagename] def getFoo()

по-прежнему не генерирует защищенный метод pukka (Java), хотя я считаю, что видимость должна быть одинаковой.

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

4b9b3361

Ответ 1

Если вы можете сэндвич Scala между двумя реализациями Java, вы можете создать суперкласс Java, который имеет только те абстрактные защищенные методы, по крайней мере, до тех пор, пока вы не конвертируете все подклассы в Scala (если это действительно код под вашим контролем). Но я надеюсь, что там будет лучший способ...

EDIT. Еще один вариант - использовать какой-то перезаписывающий байт-код, например инструмент обработки аннотаций.