使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表

Posted

技术标签:

【中文标题】使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表【英文标题】:Databinding with Kotlin and generics. error: incompatible types: Object cannot be converted to List 【发布时间】:2019-04-26 07:11:17 【问题描述】:

我通过数据绑定将InterfacesList 与类型参数绑定。

界面:

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 ...

因为当您的 ViewModelXML 想要使用您的绑定适配器时,它必须像 java 中一样是静态的!

【讨论】:

BindingAdapter 是 Java 和静态的,可与 Java ViewModel 一起使用。好主意!

以上是关于使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表的主要内容,如果未能解决你的问题,请参考以下文章

使用枚举和泛型在打字稿中获取星期几

Swift学习笔记-错误处理和泛型

trait 的泛型类型和泛型关联类型之间有啥区别?

Kotlin基础接口泛型

Day642.反射注解和泛型问题 -Java业务开发常见错误

CDI:由于多重继承和泛型抽象导致的属性注入问题