[英]Use Scala types in Java (type mismatch)
在Java中,我正在嘗試使用Scala中定義的類型,但是我遇到了“類型不匹配”錯誤。 我認為這是因為Java的類型擦除,但有沒有辦法解決這個問題?
在Scala我有這種類型
Type[T]
還有一個Action類,它使用這種類型來定義它的值類型,以保證值是已定義的類型。
class Action[T](tpe: Type[T], value: T)
現在,當存在類似於BooleanType的內容時,Action僅允許false值為true。
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對象一樣有單例
enum LongType implements Type[Long] { LongType; }
但是當我現在嘗試在Action中使用它們時
new Action(new TimestampType, 1L)
new Action(LongType.LongType, 1L)
這兩個語句都會產生編譯錯誤
:12:錯誤:類型不匹配; found:需要TimestampType:Type [Any]注意:Long <:Any(和TimestampType <:Type [Long]),但trait Type在類型T中是不變的。您可能希望將T定義為+ T。 (SLS 4.5)新動作(新時間戳類型,1L)
原因可能是因為Java類的類型擦除。 我使用+ T和-T方差,但這不能提供我想要或不編譯的功能。 我還嘗試將[T : ClassTag]
用於Action類,但這並不能解決問題。
有沒有辦法能夠實現Scala類型的Java實現? 有沒有更好的方法來嘗試強制允許值的類型或與定義的類型兼容?
問題是因為您指定了錯誤的類型。您已將其聲明為:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.