【发布时间】:2018-10-29 17:38:43
【问题描述】:
使用的类(在 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))
错误:没有足够的信息来推断
constructor Bookmarkable PageLink<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 语言执行此操作的“假设正确”的方式(只是意图,但不是真正的代码),但 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() ));
【问题讨论】:
-
<Any, T : WebPage> -
@Zoe: 不起作用 -
Unresolved reference: T然后Unexpected type specification -
嗯......为什么有人会否决一个还没有有效答案并且即使在尝试阅读官方文档后也没有轻易找到的问题?奇怪,但这就是生活..
-
您的代码似乎不匹配:Java调用有2个类型参数和3个参数,声明有1和2。那么
getParams类型是什么? -
感谢@AlexeyRomanov,我已删除 params 参数,因为它与此问题无关。但是关于1 vs 2类型参数,因为类有1个类型参数,构造函数有1个类型参数,总共有2个类型参数,所以它们实际上是匹配的。
标签: java generics kotlin wicket wildcard