gpt4 book ai didi

Android LiveData 中 Java 未经检查的调用与 Kotlin 的比较

转载 作者:行者123 更新时间:2023-12-02 01:37:52 25 4
gpt4 key购买 nike

我正在开发自己的 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
}
}
}

问题:Wrapperwrapper = 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. 最后,2019 年在 java 上开发 Android 库是个好主意吗?

最佳答案

How can i improve my Java code to make it safe?

一切都正确,除了 new Wrapper(observer) 为您提供了 Java 中的原始类型。您需要指定泛型类型:

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

这将使警告消失,所有类型现在都匹配。

除此之外,您的 Kotlin 代码和 Java 代码是等效的。您不必在 Kotlin 中指定泛型类型,因为它从观察者推断类型(并且您不必显式键入变量)。

is it a good idea to develop android libraries in 2019 on java?

您的第三个问题是基于意见的,因此不要指望在 Stack Overflow 上得到答案。

关于Android LiveData 中 Java 未经检查的调用与 Kotlin 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com