gpt4 book ai didi

java - 在 Java 中使用 Scala 类型(类型不匹配)

转载 作者:行者123 更新时间:2023-11-29 05:11:26 25 4
gpt4 key购买 nike

在 Java 中,我尝试使用 Scala 中定义的类型,但出现“类型不匹配”错误。我假设这是因为 Java 的类型删除,但有什么办法可以解决这个问题吗?

在 Scala 中我有这种类型

Type[T]

还有一个 Action 类,它使用这种类型来定义它的值类型,以保证值是定义的类型。

class Action[T](tpe: Type[T], value: T)

现在,当有类似 BooleanType 的东西时,Action 只允许 true 或 false 值。

case object BooleanType extends Type[Boolean]
new Action(BooleanType, true) // ok
new Action(BooleanType, 1) // compile error

我们也希望能够在 Java 中使用它。在 Java 中,我可以将类型定义为类

class TimestampType implements Type[Long]

或者作为一个枚举来拥有一个单例,就像 Scala 中的“case object”

enum LongType implements Type[Long] { LongType; }

但是当我现在尝试在 Action 中使用它们时

new Action(new TimestampType, 1L)
new Action(LongType.LongType, 1L)

两条语句都给出编译错误

:12: error: type mismatch; found : TimestampType required: Type[Any] Note: Long <: Any (and TimestampType <: Type[Long]), but trait Type is invariant in type T. You may wish to define T as +T instead. (SLS 4.5) new Action(new TimestampType, 1L)

原因很可能是因为Java类的类型删除。我玩过使用 +T 和 -T 方差,但这要么不提供我想要的功能,要么不编译。我还尝试将 [T : ClassTag] 用于 Action 类,但这并没有解决问题。

有什么方法可以让 Java 实现 Scala 类型?有没有更好的方法来尝试强制允许值的类型或与定义的类型兼容?

最佳答案

问题是因为您指定了错误的类型。您已将其声明为:

class TimestampType implements Type[java.lang.Long]

但在 scala 中,您执行 new Action(new TimestampType, 1L:scala.Long)java.lang.Long 不同于 scala.Long。因此错误。

以下作品:在 Java 中:

public class IntTyp implements Typ<scala.Int> {}

在标度中,

val b = new Action[Int](new IntTyp, 1)

反之亦然:

public class LongTyp implements Typ<Long> {}
val c = new Action[java.lang.Long](new LongTyp, 1L)

关于java - 在 Java 中使用 Scala 类型(类型不匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294204/

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