簡體   English   中英

Android LiveData中的Java未選中呼叫與Kotlin

[英]Java unchecked call vs Kotlin in Android LiveData

我正在開發自己的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沒有原始類型? 還是他們只是不顯示警告?
  3. 最后,在2019年用Java開發android庫是個好主意嗎?

如何改善Java代碼以使其安全?

您一切正常,只是new Wrapper(observer)在Java中提供了原始類型。 您需要指定通用類型:

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

這將使警告消失,所有類型現在都匹配。

除此之外,您的Kotlin代碼和Java代碼是等效的。 您不必在Kotlin中指定泛型類型,因為它會從observer推斷出類型(並且您不必顯式鍵入變量)。

在2019年使用Java開發android庫是個好主意嗎?

您的第三個問題是基於觀點的,因此不要期望在Stack Overflow上有任何答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM