在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实现? 是否有更好的方法来尝试强制允许值的类型或与定义的类型兼容?
答案 0 :(得分:3)
问题是因为您指定了错误的类型。您已将其声明为:
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> {}
在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)