Clojure调用Java可变参数方法:如何指定Mongo CodecRegistries重载版本
Clojure调用MongoDB CodecRegistries可变参数方法解决方案
核心解决方法
Java可变参数(varargs)在JVM底层实现为对应类型的数组,当存在fromProviders(CodecProvider...)和fromProviders(List<CodecProvider>)两个重载方法时,单参数场景下Clojure无法自动匹配可变参数版本,需手动构造对应类型的数组明确指定调用可变参数版本:
(org.bson.codecs.configuration.CodecRegistries/fromProviders (into-array org.bson.codecs.configuration.CodecProvider [(CustomCodecProvider.)]))
如果需要传入多个自定义CodecProvider,直接在数组内添加实例即可:
(org.bson.codecs.configuration.CodecRegistries/fromProviders (into-array org.bson.codecs.configuration.CodecProvider [(CustomCodecProvider.) (AnotherCodecProvider.)]))
两个及以上参数的场景下无需手动转数组,Clojure会自动匹配可变参数重载:
(org.bson.codecs.configuration.CodecRegistries/fromProviders (CustomCodecProvider.) (AnotherCodecProvider.))
原调用问题说明
- 方法名笔误:你反射查询的是
fromProviders方法,实际调用时写的是fromRegistries,后者接收的参数类型为CodecRegistry而非CodecProvider,这是首次调用报错的直接原因之一。 - 重载匹配歧义:当Java类同时存在可变参数和List入参的同名重载时,单参数场景下Clojure不会自动将单个参数包装为对应类型的数组,因此无法匹配可变参数版本,传入List会直接匹配List入参的重载,所以能正常执行。
内容的提问来源于stack exchange,提问作者arjunsv3691
相关产品推荐
相关产品推荐

