RxJava:可变参数的未检查泛型数组创建警告为何不用@SafeVarargs解决?
这问题问到点子上了,我来给你掰扯清楚背后的几个关键原因:
@SafeVarargs的使用限制与兼容性考量
首先,这个注解只能用在static、final方法或者构造函数上,而且是Java 7才引入的特性。RxJava 1.x时期还需要兼容Java 6,那时候根本没法用这个注解。就算到了RxJava 2+支持Java 8之后,团队也考虑到代码的一致性,不想因为加注解打破长期以来的代码风格,同时也避免让习惯旧版本的开发者困惑。不想用注解掩盖潜在风险
泛型可变参数的警告本质是因为类型擦除:当你调用just(T... items)时,Java会偷偷创建一个Object[]数组来存你的泛型对象,而不是真正的T[]。虽然RxJava内部的just和后续的fromArray操作只是遍历数组元素,不会做不安全的类型转换,但如果用户自己传入一个已经被“污染”的泛型数组(比如通过强制类型转换得到的List<String>[]),后续操作还是可能触发ClassCastException。
不用@SafeVarargs的话,这个警告能时刻提醒开发者注意泛型数组的固有风险,而不是用注解把问题藏起来。重载方法已经覆盖了大部分场景
RxJava为just提供了从1个参数到10个参数的重载版本(比如just(item1)、just(item1, item2)…直到just(item1, ..., item10))。这些重载版本完全不涉及可变参数,自然不会触发警告。只有当你需要传入超过10个元素时,才会用到可变参数版本——而这种场景在实际开发中其实并不多见,所以保留警告的代价是可接受的。
内容的提问来源于stack exchange,提问作者Airsaid

