解决Kotlin中Any->Unit与Enum->Unit类型Lambda的匹配问题
疑问解答
1. 为什么特定类型的Lambda不能转成Any参数的Lambda?
Kotlin函数类型遵循逆变规则:如果函数类型(P1) -> Unit的参数P1是P2的父类,那么(P1) -> Unit可以被赋值给(P2) -> Unit,反过来不行。
拿你的情况来说:
(Color) -> Unit只能处理Color类型的输入(Any) -> Unit需要能处理任意Any类型的输入
要是允许把(Color) -> Unit当成(Any) -> Unit用,Dropdown内部万一传入一个非Color的对象(比如字符串),这个Lambda直接就会崩溃。Kotlin为了保证类型安全,直接禁止这种隐式转换,所以你会看到类型不匹配的错误。
2. Any的设计初衷不是用来做这种通用场景的吗?
Any确实是所有类型的根类型,但它的作用是表示"任意类型的实例",不是用来让函数兼容任意类型参数的。通用场景正确的做法是用泛型——泛型能在编译期就保证所有相关参数的类型一致性,而用Any的话会丢失类型信息,既会导致编译警告,还可能带来运行时风险。
内容的提问来源于stack exchange,提问作者Merlin -they-them-
相关产品推荐
相关产品推荐

