Kotlin 中的 Java 泛型:在 Kotlin 中使用 Java 原始类型作为方法参数

聚甲醛

我正在 Facebook sdk 中查看这个类:

public final class ShareDialog extends 
                  FacebookDialogBase<ShareContent, Sharer.Result>

我想在 Kotlin 中有一个方法来接受它的父类,类似于以下内容:

fun shareToFacebook(shareDialog: FacebookDialogBase<ShareContent<*, *>, Sharer.Result>,
                    activity: Activity) 

但是当我尝试从 java 中调用它时:

tournamentPresenter.shareToFacebook(new ShareDialog(this), this);

我得到编译时错误:

Error:(751, 45) error: incompatible types: ShareDialog cannot be converted to FacebookDialogBase<ShareContent<?,?>,Result>

PS我知道最好不要给演示者分享对话框,我不会这样做,我们就拿它作为问题的例子

乔恩·凡尼

问题是ShareDialog的签名,它使用原始类型。

public final class ShareDialog extends 
              FacebookDialogBase<ShareContent, Sharer.Result>
.................................^^^^^^^^^^^^

而且,即使 Kotlin 文档说要*在 VM 级别使用 ,也相当于?通配符。由于 aFacebookDialogBase<ShareContent, Sharer.Result>不可分配给 aFacebookDialogBase<ShareContent<?, ?>, Sharer.Result>您的呼叫失败。

但是,使用原始类型应该在语义上等同于使用通配符作为类型参数。所以你可以做一个重新解释演员的通用等价物:

FacebookDialogBase<ShareContent<?, ?>, Sharer.Result> myVar = (FacebookDialogBase) new ShareDialog(this);
tournamentPresenter.shareToFacebook(myVar, this);

事情应该仍然几乎相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章