Могу ли я создать метод с защищенным доступом Java в Scala? - PullRequest
26 голосов
/ 13 ноября 2011

У меня есть класс 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 будет считать защищенным?

1 Ответ

2 голосов
/ 15 ноября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...