自定义绑定适配器中的通用 lambda
Generic lambda in custom binding adapter
我有一个自定义绑定适配器,其属性 onSelectItem
需要 generic lambda 表达式:
<UsersSpinner
<!-- more things -->
app:onSelectItem="@{(item) -> usersViewModel.select(item)}"/>
这是 UsersViewModel
的 select
方法的签名:
public void select(User user);
UsersSpinner
从 MyCustomSpinner<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)}"
我有一个自定义绑定适配器,其属性 onSelectItem
需要 generic lambda 表达式:
<UsersSpinner
<!-- more things -->
app:onSelectItem="@{(item) -> usersViewModel.select(item)}"/>
这是 UsersViewModel
的 select
方法的签名:
public void select(User user);
UsersSpinner
从 MyCustomSpinner<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)}"