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

时间:2017-06-23 17:12:02

标签: java generics kotlin

我在Facebook上看过这个课程sdk:

+--------+---------------------+
| Owner  | Devices(LIKE result)|
+--------+---------------------+
| Peter  | laptop              |
| Joe    | laptop              |
| Eugene | laptop              |
+--------+---------------------+
3 rows in set (0.00 sec)

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

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

但是当我尝试将其称为java:

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

我得到编译时错误:

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

P.S。我知道最好不向演示者提供分享对话,我不打算这样做,让我们把它作为问题的一个例子

1 个答案:

答案 0 :(得分:0)

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

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

而且,即使Kotlin文档说使用*,在相当于?的VM级别,也使用通配符。由于FacebookDialogBase<ShareContent, Sharer.Result>无法分配给FacebookDialogBase<ShareContent<?, ?>, Sharer.Result>您的通话失败。

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

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

事情应该仍然有相同的效果。