Kotlin中@Deprecated的ReplaceWith泛型场景失效问题求助
解决方案
要正确配置@Deprecated注解的ReplaceWith参数,适配inline reified泛型函数的替换场景,你需要利用ReplaceWith的typeArguments参数显式指定泛型参数的映射关系,让IDE自动替换时生成正确的泛型声明。
正确的注解配置
修改old函数的废弃注解如下:
@Deprecated( message = "请使用new<T>()替代", replaceWith = ReplaceWith( expression = "new()", typeArguments = ["T"] ) ) fun <T> old(clazz: Class<T>): T { TODO() }
原理说明
expression = "new()"指定了替换的目标函数调用,由于new是inline reified泛型函数,原本可省略泛型声明,但我们需要通过typeArguments强制IDE添加正确的泛型参数。typeArguments = ["T"]表示将原函数的泛型参数T映射到新函数的泛型参数位置,IDE自动替换时会把T替换为实际类型(比如String),最终生成new<String>()这类正确调用,既不会缺失泛型声明,也不会产生多余字符。
验证效果
对val foo = old(String::class.java)执行自动修正后,IDE会生成正确代码:
val foo = new<String>()
该写法符合Kotlin语法规则,能让编译器正确推断类型,避免编译错误。
内容的提问来源于stack exchange,提问作者Kikju
相关产品推荐
相关产品推荐

