在Kotlin中调用Java第三方API时如何传递带界通配符类型参数?
Kotlin调用Java泛型类的泛型推断问题分享
最近在项目里遇到个头疼的问题:要在Kotlin中调用一个不可修改的Java第三方API类BookmarkablePageLink,结果泛型推断卡壳了,折腾了好几种写法都踩坑,下面跟大家唠唠整个过程。
基础定义说明
首先是那个不能修改的Java类:
public class BookmarkablePageLink<T> extends Link<T> { public <C extends Page> BookmarkablePageLink(final String id, final Class<C> pageClass) }
我要调用的场景里,bookmark.page是Java代码中的属性,它的定义为:
public Class<? extends WebPage> getPage()
直接调用触发报错
一开始我想照搬Java的思路写Kotlin代码:
item.queue(BookmarkablePageLink("link", bookmark.page))
结果直接弹出错误提示:
错误:无法推断构造函数
BookmarkablePageLink<T : Any!, C : Page!>(...)中的参数T
多种尝试均失败
我试了一堆写法,全部都没能解决问题:
item.queue(BookmarkablePageLink<>("link", bookmark.page))item.queue(BookmarkablePageLink<Any>("link", bookmark.page))item.queue(BookmarkablePageLink<Any, *>("link", bookmark.page))item.queue(BookmarkablePageLink<Any, WebPage>("link", bookmark.page))item.queue(BookmarkablePageLink<Any, in WebPage>("link", bookmark.page))item.queue(BookmarkablePageLink<Any, out WebPage>("link", bookmark.page))item.queue(BookmarkablePageLink<Any, T : WebPage>("link", bookmark.page))
甚至想模仿Java的通配符写法,可惜Kotlin不支持这种语法,只能作罢:
// 仅为示意,Kotlin不支持该写法 item.queue(BookmarkablePageLink<Any, ? extends WebPage>("link", bookmark.page))
可行但不够优雅的解决方案
折腾半天,终于找到一个能正常运行的写法——给bookmark.page加个类型强转:
item.queue(BookmarkablePageLink<Any, WebPage>("link", bookmark.page as Class<WebPage>))
对比Java里的写法,简直简洁太多了:
item.queue(new BookmarkablePageLink<>("link", bookmark.getPage()));
内容的提问来源于stack exchange,提问作者Hendy Irawan
相关产品推荐
相关产品推荐

