簡體   English   中英

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

[英]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.Longscala.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM