You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:48:05