混合 Kotlin 和 Scala 之间的协方差

问题描述 投票:0回答:1

我有一个 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()。

我该怎么做?

scala covariance
1个回答
0
投票

您这里有两个问题。

1/ 在 Scala 中,

Int
不是
AnyRef
(引用类型)的子类型,而是
AnyVal
(所有值类型)的子类型。
Any
是两者的超类型。

在纯 Scala 代码中你会遇到同样的错误:

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

def processResult(result: Result[AnyRef]) = println(s"x ${result.value}")

processResult( new Result[Int](4) )

使用

Any
解决了第一个问题。尽管您可能会丢失有关基础类型的任何信息,但可能不鼓励这样做。

您可以将类型添加到方法本身:

def processResult[T](result: Result[T]) = println(s"x ${result.value}")

这取决于您期望做什么。

2/ 事实上,Kotlin

out
和 Scala
+/-
之间没有互操作。

如果你真的需要这个,我想你可以在 Scala 中创建一个包装类?

© www.soinside.com 2019 - 2024. All rights reserved.