gpt4 book ai didi

java - 如何处理 Java 中的 Scala 类型中的协变

转载 作者:行者123 更新时间:2023-12-01 10:53:10 27 4
gpt4 key购买 nike

在我们的 Scala 项目中,我们使用包含协变类型参数的类型来传达决策。

sealed trait ArbiterResponse[+Tasks]

object Reject extends ArbiterResponse[Nothing]

trait Proceed[Tasks] extends ArbiterResponse[Tasks]
object Proceed extends Proceed[Nothing]
case class ProceedConditionally[Tasks](tasks : Tasks) extends Proceed[Tasks]

当从 Java 使用它时,我收到一个错误 ArbiterResponse<SomeTask>无法转换为 Reject$在:

final ArbiterResponse<SomeTask> response = ???
if (task instanceof Reject$) { ... }

error: incompatible types: ArbiterResponse cannot be converted to Reject$

如何解决这个问题?我想这是因为 Java 编译器不了解协变/逆变。我通过添加描述 ArbiterResponse 类型的标志来解决这个问题。一个回应是。但我不太喜欢这个解决方案,因为它是相当手动的、容易出错的工作。谁有更好的主意?

sealed trait ArbiterResponse[+Tasks] {
def isRejected: Boolean
def isProceed: Boolean
def isProceedConditionally: Boolean
}

object Reject extends ArbiterResponse[Nothing] {
def isRejected = true
def isProceed = false
def isProceedConditionally = false
}

trait Proceed[Tasks] extends ArbiterResponse[Tasks] {
def isRejected = false
def isProceed = true
def isProceedConditionally = false
}
object Proceed extends Proceed[Nothing]

case class ProceedConditionally[Tasks](tasks : Tasks) extends Proceed[Tasks] {
override def isProceedConditionally = true
}

最佳答案

在大多数情况下,从 java 调用 scala 代码是相当棘手的。但无论如何,如果您希望通过类型转换的方式,那么您可以这样做:

    for (Object response : Arrays.asList(new ProceedConditionally("asdf"), Reject$.MODULE$)) {
if(Reject$.class.isInstance(response)){
Reject$ cast = Reject$.class.cast(response);
System.out.println(cast);
}else if(Proceed.class.isInstance(response)){
System.out.println("Proceed");
}else{
System.out.println("Nothing: "+response.getClass());
}
}

打印

Proceed

prac.Reject$@266474c2

但它可能很快就会因不同的 scala 版本而崩溃,或者很难做到正确。一种方法可能是通过访问者模式方式。它并不完全令人满意,但可能会有所帮助

sealed trait ArbiterResponse[+Tasks]{
def doSomething
}

object Reject extends ArbiterResponse[Nothing]{
def doSomething = ???
}

trait Proceed[Tasks] extends ArbiterResponse[Tasks]
object Proceed extends Proceed[Nothing]{
def doSomething = ???
}
case class ProceedConditionally[Tasks](tasks : Tasks) extends Proceed[Tasks]{
def doSomething = println(tasks)
}

关于java - 如何处理 Java 中的 Scala 类型中的协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com