网易首页 > 网易号 > 正文 申请入驻

Kotlin这套类型把戏玩了3年,谷歌工程师终于摊牌了

0
分享至


2024年Android开发者调查里,一个数据挺扎眼:67%的ViewModel实现存在类型安全漏洞,但编译器一声不吭。问题出在领域层和表现层的接缝处——编译期类型信息在这里自然蒸发,像热水倒进雪地。

谷歌工程师Pietro Maggi在RandomPokemon仓库里埋了一套解法,用了三年才被社区挖出来。核心武器是自引用泛型(Self-Referential Generics)配合实化类型参数(Reified Type Parameters),让运行期类型校验和编译期静态检查握手言和。

ResultState的设计:故意把类型信息抹掉

先看领域层的输出结构。这是一个密封类(Sealed Class),三个状态分支:

Running和Error不携带业务数据,Complete用协变泛型把产出类型O包进去。注意out关键字——ResultState是数据的来源方,你只能从中读取O,从不写入。

UseCase的抽象类设计更有意思。in标记表示逆变:UseCase消费O来更新状态,但从不把O交还给调用方。protected fun O?.update()把成功结果塞进_state,而暴露给外界的state属性类型是StateFlow。

这里的类型擦除是设计意图,不是缺陷。O在UseCase内部是具体的,越过边界就变成Any?。ViewModel拿到useCase.state时,编译器已经不知道Complete里装的是什么。

自引用泛型:让子类自己指认自己

BaseViewModel的签名长这样:

abstract class BaseViewModel>

这种"自己引用自己"的写法,在Java时代叫CRTP(Curiously Recurring Template Pattern),Kotlin里换个名字继续用。目的是把运行时才能确定的类型信息,提前锁进编译期的类型系统。

配合实化类型参数(Reified Type Parameters),你可以在inline函数里用T::class.java拿到Class对象,而不是看着泛型被擦成Object。Kotlin的reified关键字本质是编译器帮你把类型信息从调用点抄进方法体,代价是方法必须内联。

Maggi的实现把两者焊在一起:BaseViewModel的子类通过自引用泛型声明"我是什么类型",collectUseCase()用reified inline函数在运行时核对这个声明是否属实。

运行期校验:类型错配当场爆炸

关键代码在collectUseCase扩展函数里。它接收一个UseCase<*>,但要求调用方用泛型指定期望的输出类型Expected。

函数内部做三件事:启动Flow收集、收到Complete时检查actualData is Expected、类型不匹配直接抛IllegalStateException。这套机制把"编译期应该发现但没发现"的错误,推迟到运行期首次触发时引爆,而不是带着脏数据流进生产环境。

对比传统做法:要么用unchecked cast强行压制警告,把风险埋进代码;要么在ViewModel里写一堆when分支手动拆箱,重复劳动还容易漏。Maggi的方案让错误在边界处显形,且只显形一次。

协变和逆变的搭配也有讲究。Complete保证你只读不写,UseCase保证你只写不读,两者通过ResultState?这个"最小公分母"对接。如果你把in和out写反了,编译器会在数据流断裂的地方标红——这比文档管用。

代价:这套把戏不是免费的

inline函数的字节码膨胀是明账。每个调用点都会复制一份collectUseCase的实现,类型检查越复杂,膨胀越严重。RandomPokemon的代码量小,感知不强;大规模项目需要权衡。

更隐蔽的成本在心智负担。团队里得有人真懂reified和自引用泛型的交互,而不是照搬模板。Cargo-culting(盲目模仿)在这里尤其危险——抄了代码没抄懂约束条件,运行期异常照样冒出来,只是换了个姿势。

Maggi在提交注释里写得很克制:"This enforces a single, standardized way to consume use case output." 没有"革命性",没有"最佳实践",就是一个边界处的类型安全补丁。

这套模式能被社区挖出来,某种程度上说明Android架构的痛点足够普遍。Jetpack ViewModel本身不解决领域层到表现层的类型映射问题,把空白留给开发者填。填法有很多种,Maggi选了最保守的一种:承认编译器帮不了,就在运行期加一道安检。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“4只皮皮虾1035元”,游客称未收到退款,官方回复:未超出调控价格,已对司机和餐馆展开调查

“4只皮皮虾1035元”,游客称未收到退款,官方回复:未超出调控价格,已对司机和餐馆展开调查

极目新闻
2026-05-07 18:29:41
得知好几个老同学离婚的原因后,我才发现:没钱的婚姻就是个笑话

得知好几个老同学离婚的原因后,我才发现:没钱的婚姻就是个笑话

小马达情感故事
2026-05-06 19:45:03
两性关系:女人最爱这2种肢体触摸,99%女人都会动情

两性关系:女人最爱这2种肢体触摸,99%女人都会动情

皓皓情感说
2026-05-05 10:06:10
坚持首先查明事件原因,强调派兵面临法律限制,韩国谨慎应对货船爆炸事件

坚持首先查明事件原因,强调派兵面临法律限制,韩国谨慎应对货船爆炸事件

环球网资讯
2026-05-07 06:59:06
特朗普访华前夕,中国自曝家底!美媒表示中国这张王牌是躲不开

特朗普访华前夕,中国自曝家底!美媒表示中国这张王牌是躲不开

杰丝聊古今
2026-05-08 04:50:14
在岸人民币兑美元较周三夜盘收盘涨65点

在岸人民币兑美元较周三夜盘收盘涨65点

财联社
2026-05-08 03:24:14
王晓晨,结婚后发福了

王晓晨,结婚后发福了

动物奇奇怪怪
2026-05-08 03:38:45
佩雷拉:刚战蓝军又战维拉太难,为凑齐名单我甚至放3名伤员

佩雷拉:刚战蓝军又战维拉太难,为凑齐名单我甚至放3名伤员

懂球帝
2026-05-08 05:58:09
AI记账软件怼用户159元给父亲买寿衣,“寿衣是死人穿的,你爸穿的蓝白衫确实像”,官方回应:系AI话术漏洞所致,非人为恶意,已紧急修复

AI记账软件怼用户159元给父亲买寿衣,“寿衣是死人穿的,你爸穿的蓝白衫确实像”,官方回应:系AI话术漏洞所致,非人为恶意,已紧急修复

扬子晚报
2026-05-06 20:50:03
加速糖尿病恶化的原因:喝酒排第4,排第1的,很多人还在天天做

加速糖尿病恶化的原因:喝酒排第4,排第1的,很多人还在天天做

医学科普汇
2026-05-07 22:35:04
回国后我才敢说:印尼是我去过的所有东南亚国家中,最被低估的

回国后我才敢说:印尼是我去过的所有东南亚国家中,最被低估的

千秋文化
2026-04-28 20:20:16
贝弗利:希望KD不是装病 若是我看到老詹大杀四方 我打封闭也要上

贝弗利:希望KD不是装病 若是我看到老詹大杀四方 我打封闭也要上

林子说事
2026-05-07 15:41:04
欧盟计划将中国可再生能源设备制造商逐出市场

欧盟计划将中国可再生能源设备制造商逐出市场

俄罗斯卫星通讯社
2026-05-07 15:10:15
公安部提醒警惕网络水军:好评如潮可能都是刷的!

公安部提醒警惕网络水军:好评如潮可能都是刷的!

中国能源网
2026-05-07 10:39:04
WTA罗马站:萨巴伦卡2-0横扫前法网冠军晋级

WTA罗马站:萨巴伦卡2-0横扫前法网冠军晋级

七七自驾游
2026-05-08 05:11:53
河南省驻马店市人大常委会原党组副书记贾迎战被开除党籍

河南省驻马店市人大常委会原党组副书记贾迎战被开除党籍

界面新闻
2026-05-07 16:10:47
剩48小时,俄发布撤侨通知,乌国要打莫斯科,中方划定禁止区域

剩48小时,俄发布撤侨通知,乌国要打莫斯科,中方划定禁止区域

你是我的一个梦
2026-05-08 03:54:27
150人死而复生后,说出1个惊人共同点,科学家至今无法解释

150人死而复生后,说出1个惊人共同点,科学家至今无法解释

Thurman在昆明
2026-05-07 14:37:38
NFL名帅与女记者游艇密会曝光,女方当时正怀孕

NFL名帅与女记者游艇密会曝光,女方当时正怀孕

娱圈观察员
2026-05-08 00:13:14
韩鹏胆子真大!中超已踢完十轮联赛,却仍没让这五位王牌出场亮相

韩鹏胆子真大!中超已踢完十轮联赛,却仍没让这五位王牌出场亮相

振刚说足球
2026-05-07 10:07:35
2026-05-08 06:27:00
硅屿手记
硅屿手记
有态度网友ytd
3652文章数 19关注度
往期回顾 全部

科技要闻

月之暗面完成20亿美元融资,估值突破200亿

头条要闻

伊朗武装部队:美军违反停火空袭伊朗 已反击

头条要闻

伊朗武装部队:美军违反停火空袭伊朗 已反击

体育要闻

巴黎再进欧冠决赛,最尴尬的情况还是发生了

娱乐要闻

Lisa主持!宁艺卓观看脱衣秀风波升级

财经要闻

人均年薪406万,这家ST公司惊呆市场!

汽车要闻

雷克萨斯全新纯电三排SUV 全新TZ全球首发

态度原创

艺术
房产
亲子
公开课
军事航空

艺术要闻

21 岁徐悲鸿画的 “天价仙女”,被网友骂 “生无可恋”

房产要闻

负债23亿,抵押482亩地!海南这家巨头,惨遭拍卖!

亲子要闻

只祝她“母亲节快乐”是不够的

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普:美伊"很可能"达成协议

无障碍浏览 进入关怀版