使用View Binding时如何为泛型View子类指定类型参数?
可用解决方案
方案1:封装泛型强转逻辑(适配Kotlin/Java两种开发语言)
该方案只需编写一次封装代码,所有调用场景都可以复用,无需每次手动添加强转代码或忽略注解。
- Kotlin 实现:
编写通用扩展方法:
@Suppress("UNCHECKED_CAST") fun <T> Spinner<*>.typed() = this as Spinner<T>
调用方式:
views.foobarSpinner.typed<Foobar>().setItems(foobars)
- Java 实现:
编写静态工具类方法:
@SuppressWarnings("unchecked") public static <T> Spinner<T> typedSpinner(Spinner<?> spinner) { return (Spinner<T>) spinner; }
调用方式:
typedSpinner(views.foobarSpinner).setItems(foobars);
方案2:子类固定泛型类型(适用于固定类型的使用场景)
如果该自定义泛型View在你的业务场景中只会绑定固定的数据类型,可以直接写一个指定泛型参数的子类,布局中直接使用子类控件即可:
public class FoobarSpinner extends Spinner<Foobar> { // 保留原Spinner的所有构造方法即可 public FoobarSpinner(Context context) { super(context); } public FoobarSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public FoobarSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }
布局文件中将原org.example.views.Spinner替换为org.example.views.FoobarSpinner,View Binding生成的控件类型就是确定的FoobarSpinner,调用时不会产生任何未检查警告。
补充说明
目前View Binding本身没有提供泛型参数声明的支持,以上两种是现有版本下最为简洁的规避方案,相比每次手动加忽略注解、手动强转的操作,代码冗余度低很多,也更容易维护。
内容的提问来源于stack exchange,提问作者TaylanKammer
相关产品推荐
相关产品推荐

