如何在Scala中匹配未知泛型类型且不触发编译警告
解决方案
你可以通过以下两种方式实现需求:
方案1:使用@unchecked注解消除警告
直接在类型后面加@unchecked注解,显式告知编译器忽略泛型擦除带来的类型检查告警,匹配后可直接调用get方法:
def foo(arbitraryInput: Object): Option[Object] = { arbitraryInput match { case map: Map[Object, Object] @unchecked => map.get("foo") // 其他匹配分支 case _ => None } }
该注解的作用就是明确告诉编译器「我清楚运行时泛型类型会被擦除,不需要做类型参数检查」,完全符合你的要求。
方案2:通配符匹配后手动强转
如果选择用Map[_, _]做无类型参数匹配,可以匹配后通过asInstanceOf手动转换为你需要的Map[Any, Any]类型:
def foo(arbitraryInput: Object): Option[Object] = { arbitraryInput match { case map: Map[_, _] => map.asInstanceOf[Map[Any, Any]].get("foo") // 其他匹配分支 case _ => None } }
因为泛型擦除的存在,这个转换在运行时没有额外开销,也不会抛出异常,符合你不需要校验泛型参数、直接用Object/Any类型处理的需求。
内容的提问来源于stack exchange,提问作者DWR
相关产品推荐
相关产品推荐

