gpt4 book ai didi

java - 如何在 Kotlin 中传递有界通配符类型参数?

转载 作者:IT老高 更新时间:2023-10-28 13:34:08 26 4
gpt4 key购买 nike

使用的类(在 Java 中,第三方 API,不可更改):

public class BookmarkablePageLink<T> extends Link<T> {

public <C extends Page> BookmarkablePageLink(final String id, final Class<C> pageClass)

现在我想从 Kotlin 调用它:

item.queue(BookmarkablePageLink("link", bookmark.page))

bookmark.page在 Java 中,它是:public Class<? extends WebPage> getPage()

这些都不起作用:

item.queue(BookmarkablePageLink("link", bookmark.page))

Error: Not enough information to infer parameter T in constructor Bookmarkable PageLink<T : Any!, C : Page!>(...)

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 语言中“假设正确”的方式(只是意图,但不是真正的代码),但是 this isn't supported by Kotlin :

item.queue(BookmarkablePageLink<Any, ? extends WebPage>("link", bookmark.page))

我最好的解决方法是这样,虽然很丑,但很有效:

item.queue(BookmarkablePageLink<Any, WebPage>("link", bookmark.page as Class<WebPage>))

令人惊讶的是,在 Java 中这简直就是:

item.queue(new BookmarkablePageLink<>("link", bookmark.getPage() ));

最佳答案

据我所知,BookmarkablePageLink(...)应该大约等于 new BookmarkablePageLink<>在 Java 中,所以这是“应该”工作的选项。您尝试过的所有其他人都不应该这样做,每个人都有不同的原因。

具有自己类型参数的构造函数非常罕见(在看到这个问题之前我认为它们是非法的),因此它们可能会在 Kotlin 编译器的某个地方被忽略。一种可能的解决方法是将其改为函数:

fun <T, C : Page> makeBookmarkablePageLink(id: String, clazz: Class<C>): BookmarkablePageLink<T> = 
BookmarkablePageLink<T, C>(id, clazz)

然后

item.queue(makeBookmarkablePageLink("link", bookmark.page))

我还要注意,我很确定

the "correct" way to do this in Java-speak

实际上是错误的;实际上你不能在 Java 中显式写下类型参数,因为第二个类型参数是 captured wildcard .

关于java - 如何在 Kotlin 中传递有界通配符类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50425552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com