2017-04-12 61 views
2

我需要以下類型的延伸的Java類(從庫中):如何延長下面的Java類在Scala中:類A <T延伸可比<? super T>>

public class A<T extends Comparable<? super T>> { 
} 

我試圖實現擴展斯卡拉類爲:

class B[T <: Comparable[_ >: T]] extends A[T] { 
} 

不幸的是,這斯卡拉類不使用Scala 2.12.1編譯:

Error:(4, 25) illegal cyclic reference involving type T 
class B[T <: Comparable[_ >: T]] extends A[T] { 

我該如何解決這個問題?

回答

3

您可以嘗試定義該嵌套類型的別名:

object B { 
    type ComparableBySuper[LUB] = Comparable[_ >: LUB] 
} 

class B[T <: ComparableBySuper[T]] extends A[T] 
+0

這就是它!非常感謝。 –

+0

切勿使用小寫字符定義類型。 – flavian

+0

@flavian當然,我只是爲了舉例而做了 –

0

斯卡拉插件的IntelliJ IDEA將這種代碼

class B[T <: Comparable[(_$1) forSome {type _$1 >: T}]] extends A[T] { 
} 
+0

不幸的是,這段代碼產生了相同的編譯器錯誤。 –

1

這實際上是一個什麼樣的Scala調用類型的lambda一個非常棒的應用,它遵循與接受的答案大致相同的方法,但是避開了將類型i嵌套到另一個對象的要求。

「正確」的方式對於所有的Scala的功能來做到這一點:

class B[T <: ({type LUB[A] = Comparable[_ >: A]})#LUB[T]] extends A[T] 
+0

有趣的解決方案。您只需要在#LUB之後添加類型參數[T]以便讓它編譯:class B [T <:({type LUB [A] = Comparable [_>:A]})#LUB [T]]擴展A [T] –

+0

@StefanEndrullis確實抱歉。 – flavian

相關問題