You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:59:29