Вызов Java не проверяется против Котлина в Android LiveData - PullRequest
0 голосов
/ 03 марта 2019

Я разрабатываю свое собственное расширение LiveData.

Я решил сделать это в Java.

Мой код:

public class LiveEvent<T> extends LiveData<T> {

    @Override
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        // unchecked!
        Wrapper wrapper = new Wrapper(observer);
        super.observe(owner, observer);
    }

    public class Wrapper<V> implements Observer<V> {
        private final Observer<? super V> mObserver;

        Wrapper(final Observer<? super V> observer) {
            mObserver = observer;
        }

        @Override
        public void onChanged(V v) {
            //todo
        }
    }
}

Проблема: Wrapper wrapper = new Wrapper(observer); Не проверен звонок.Однако в kotlin это выглядит довольно неплохо:

class LiveEvent<T> : LiveData<T>() {

    override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        val wrapper = Wrapper(observer)
        super.observe(owner, observer)
    }

    inner class Wrapper<T> internal constructor(private val mObserver: Observer<in T>) : Observer<T> {

        override fun onChanged(t: T) {
            //todo
        }
    }
}

Итак, у меня есть несколько вопросов:

  1. Как я могу улучшить свой Java-код, чтобы сделать его безопасным?
  2. Действительно ли подстановочные знаки kotlin действительно безопасны, потому что у kotlin нет типа raw ?Или они просто не показывают предупреждения?
  3. И, наконец, стоит ли разрабатывать библиотеки Android в 2019 году на Java?

1 Ответ

0 голосов
/ 03 марта 2019

Как я могу улучшить свой Java-код, чтобы сделать его безопасным?

У вас все правильно, кроме new Wrapper(observer) дает вам необработанный тип в Java.Вам необходимо указать универсальный тип:

Wrapper<T> wrapper = new Wrapper<>(observer);

Это предупредит вас, все типы теперь будут совпадать.

Кроме того, что ваш код Kotlin и код Java эквивалентны.Вам не нужно указывать универсальный тип в Kotlin, потому что он выводит тип из observer (и вам не нужно явно вводить переменные).

это хорошая идея для разработки библиотек Androidв 2019 году на java?

Ваш третий вопрос основан на мнениях, поэтому не ожидайте ответа здесь о переполнении стека.

...