Как заставить вызов Java перегруженному методу Kotlin, принимающему ненулевой параметр? - PullRequest
0 голосов
/ 28 апреля 2019

В Kotlin у меня есть два перегруженных метода, определенных для объекта.Они имеют одинаковую сигнатуру, за исключением того, что в одном случае параметр имеет значение NULL, а в другом случае тот же параметр - нет.Исходя из того, что переданный параметр является обнуляемым или нет, одна перегрузка выбирается вместо другой:

fun getBooleanPropertyValue(key: String, dflt: Boolean? = null) : Optional<Boolean> {
}

fun getBooleanPropertyValue(key: String, dflt: Boolean) : Boolean {
}

Надеюсь, понятно, что здесь происходит.Если я могу предоставить ненулевое значение по умолчанию для свойства, то класс всегда может вернуть ненулевое значение для этого свойства, и поэтому он возвращает его напрямую.Если я не могу предоставить ненулевое значение по умолчанию, тогда класс возвращает Optional, потому что не может быть уверен, что может передать обратно ненулевой объект.

Все это прекрасно работает в Kotlin,но теперь я хочу назвать ненулевую версию из Java.У меня есть что-то вроде этого:

static final Boolean defaultIsDisabled = false;
Boolean isDisabled = propSource.getBooleanPropertyValue("isDisabled", defaultIsDisabled);

Я получаю здесь ошибку, потому что Java вызывает метод, который принимает ненулевое значение по умолчанию, и поэтому возвращает Optional, и я пытаюсь назначить этодо Boolean.Но в этом случае значение по умолчанию, которое я передаю, никогда не может быть null, и я хочу получить Boolean напрямую.

Я знаю, что Java может вызывать другой метод, потому что это работает:

Boolean isDisabled = propSource.getBooleanPropertyValue("isDisabled", false);

Я пытался использовать различные варианты аннотаций @Notnull/@Nonnull для значения defaultIsDisabled, чтобы сказать Java, что это никогда не может быть null, но я не могу понять, как заставить Java вызыватьверсия метода, которая возвращает голую Boolean.

Может кто-нибудь сказать мне, как заставить Java вызывать версию этого метода, которая принимает ненулевое значение по умолчанию при предоставлении этого значения через переменную?

1 Ответ

2 голосов
/ 28 апреля 2019

Не обнуляемый Boolean - это просто boolean в Java. Чтобы вызвать ненулевую перегрузку, просто используйте приведение:

static final Boolean defaultIsDisabled = false;
boolean isDisabled = propSource.getBooleanPropertyValue("isDisabled", (boolean) defaultIsDisabled);

Это работает только потому, что Kotlin оптимизирует второй метод для принятия boolean, а не Boolean, поэтому сигнатуры двух методов различаются в сгенерированном байт-коде. В случае эквивалентных методов, принимающих параметр String, невозможно вызвать ни один из этих методов из Java. Kotlin создает два метода с одинаковыми сигнатурами, и когда вы пытаетесь вызвать один из них из Java, вы получаете ошибку «Неоднозначный вызов метода».

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