使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表
Posted
技术标签:
【中文标题】使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表【英文标题】:Databinding with Kotlin and generics. error: incompatible types: Object cannot be converted to List 【发布时间】:2019-04-26 07:11:17 【问题描述】:我通过数据绑定将Interfaces
的List
与类型参数绑定。
界面:
public interface MyInterface<T>
T getValue();
视图模型:
public class MyViewModel
public ObservableField<List<MyInterface>> name = new ObservableField<>();
绑定适配器:
@android.databinding.BindingAdapter("bind")
public static void bind(TextView textView, List<MyInterface> list)
XML:
<data>
<variable
name="viewModel"
type="com.example.myname.playground4.MyViewModel"/>
</data>
<TextView
android:layout_
android:layout_
app:bind="@viewModel.name"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
只要ViewModel
在 Java 中,它就可以工作。
当我将ViewModel
转换为 Kotlin 时:
class MyKotlinViewModel
val name = ObservableField<List<MyInterface<*>>>()
我的ActivityMainBindingImpl.java
出现错误:
错误:不兼容的类型:对象无法转换为列表
这是错误的方法:
@Override
protected void executeBindings()
long dirtyFlags = 0;
synchronized(this)
dirtyFlags = mDirtyFlags;
mDirtyFlags = 0;
android.databinding.ObservableField viewModelName = null;
java.util.List viewModelNameGet = null;
com.example.fweigl.playground4.MyKotlinViewModel viewModel = mViewModel;
if ((dirtyFlags & 0x7L) != 0)
if (viewModel != null)
// read viewModel.name
viewModelName = viewModel.getName();
updateRegistration(0, viewModelName);
if (viewModelName != null)
// read viewModel.name.get()
viewModelNameGet = viewModelName.get(); // error is here
// batch finished
if ((dirtyFlags & 0x7L) != 0)
// api target 1
com.example.fweigl.playground4.BindingAdapter.bind(this.mboundView0, viewModelNameGet);
有人知道这个问题的原因和/或如何解决这个问题吗?
你可以自己试试我的测试项目@https://github.com/fmweigl/playground4。 (工作)java 版本在分支“master”上,(非工作)kotlin 版本在分支“kotlin”上。
【问题讨论】:
这听起来应该是bug filed against Data Binding。 @ianhanniballake 会的,谢谢。 【参考方案1】:我认为您的问题与您的 BindingAdapter 有关。在 Kotlin 中,您必须在 BindingAdapter 顶部添加 @JvmStatic
注释。
像这样:
@JvmStatic
@BindingAdapter("bind")
fun bind(recyclerView: RecyclerView, items: MutableList<SmartResult>)
//Anything that you wanna do ...
因为当您的 ViewModel
和 XML
想要使用您的绑定适配器时,它必须像 java 中一样是静态的!
【讨论】:
BindingAdapter 是 Java 和静态的,可与 Java ViewModel 一起使用。好主意!以上是关于使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表的主要内容,如果未能解决你的问题,请参考以下文章