Могу ли я создать метод с защищенным доступом 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 помечается как общедоступный в классе javap'd. Но

protected[packagename] def getFoo()

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

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

26
задан Duncan McGregor 14 November 2011 в 10:01
поделиться

1 ответ

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

РЕДАКТИРОВАТЬ : Другой вариант заключается в использовании некоторого вида перезаписывающего устройства байт-кода, такого как инструмент обработки аннотаций .

2
ответ дан 28 November 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: