Kotlin和Scala之间的混合协方差

1sbrub3j  于 4个月前  发布在  Scala
关注(0)|答案(1)|浏览(83)

我有一个Kotlin类

class Result<out ResultType>(val value: ResultType, val msg:String?)

字符串
我在Scala中使用它没有任何问题,直到我尝试写这样的东西,

def processResult(result: Result[AnyRef]) = ...

processResult( new Result[Int](4) )


最后一行无法编译,因为

type mismatch;
   found   : Result[Int]
   required: Result[AnyRef]


现在,我预计Scala将无法理解Kotlin的“out”定义,但我不认为无论如何都要以一种不会迫使我每次都编写显式强制转换的方式编写processResult()。
我该怎么做?

z9smfwbn

z9smfwbn1#

这里有两个问题。
1/在Scala中,Int不是AnyRef(引用类型)的子类型,而是AnyVal(所有值类型)的子类型。
在纯Scala代码中也会出现同样的错误:

case class Result[+ResultType](value: ResultType)

def processResult(result: Result[AnyRef]) = ???

processResult(new Result[Int](4))

字符串
使用Any解决了第一个问题,但这可能不被鼓励,因为你可能会丢失关于底层类型的任何信息。
您可以将类型添加到方法本身:

def processResult[T](result: Result[T]) = ???


这取决于你期望做什么。
2/事实上,Kotlinout和Scala +/-之间没有互操作。不幸的是,我不认为有一个简单的方法。
编辑:正如Luis在评论中所建议的,在 Package 器类中使用.asInstanceOf的 Package 器类+可能是一个解决方案。

相关问题