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

时间:2015-02-03 08:17:30

标签: java scala

在Java中,我尝试使用Scala中定义的类型,但是我遇到了“匹配不匹配”的问题。错误。我认为这是因为Java的类型擦除,但有什么方法可以解决这个问题吗?

在Scala我有这种类型

Type[T]

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

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

现在,当有类似于BooleanType的内容时,Action只允许使用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中的'案例对象一样的单例

enum LongType implements Type[Long] { LongType; }

但是当我现在尝试在Action

中使用它们时
new Action(new TimestampType, 1L)
new Action(LongType.LongType, 1L)

两个语句都给出了编译错误

  

:12:错误:类型不匹配;    发现:TimestampType    必填:输入[任意]   注意:Long&lt ;: Any(和TimestampType&lt ;: Type [Long]),但trait Type在类型T中是不变的。   您可能希望将T定义为+ T。 (SLS 4.5)                 新动作(新时间戳类型,1L)

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

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

1 个答案:

答案 0 :(得分:3)

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

class TimestampType implements Type[java.lang.Long]

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

以下作品: 在Java中:

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

在scala中,

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

反之亦然:

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