自定义绑定适配器中的通用 lambda

Generic lambda in custom binding adapter

我有一个自定义绑定适配器,其属性 onSelectItem 需要 generic lambda 表达式:

<UsersSpinner
    <!-- more things -->

    app:onSelectItem="@{(item) -> usersViewModel.select(item)}"/>

这是 UsersViewModelselect 方法的签名:

public void select(User user);

UsersSpinnerMyCustomSpinner<T> 扩展而来。这是绑定适配器:

  @BindingAdapter("onSelectItem")
    public static <T> void setOnSelectItem(MyCustomSpinner<T> view, final OnSelectItem<T> onSelectItem) {
        view.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                T item = (T) adapterView.getSelectedItem();
                onSelectItem.onSelectItem(item);
            }
        });
    }

问题是 UsersViewModel.select(User u) 需要一个用户,但是这里:

@{(item) -> viewModel.select(item)}

item 不是 User,而是 Object,因为 OnSelectItem<T> 的通用参数不是 "applied"。所以,没有方法 UsersViewModel.select(Object o),我得到一个编译错误。

好吧,我终于通过替换这个解决了

app:onSelectItem="@{(item) -> usersViewModel.select(item)}"

app:onSelectItem="@{(item) -> usersViewModel.select((User)item)}"