用`?转换Java`sort`签名 超级T`到Scala(仿制药)
问题:
查看有关迁移Java签名的问题
public <A extends Comparable> void sort(List list) { }
对Scala来说,似乎没有办法避免
illegal cyclic reference involving type T
如果您像这样进行字面翻译,则会出错。
def compilerFailure[T : T]](a: Array[T]): T = { }
解决方法似乎是这样做
def workaround[A : A](list: List[A]) { }
如果你从字节码回程到Java,你得到这个(它失去了super
部分)
public <T extends Comparable, U> void scalaToJava(List a) { }
我的问题:
scalaToJava
版本是否等效于以下内容?
public <T extends Comparable> void sort(List a) {
我想当U
无界时,它可能也是?
或Object
没有? 然后,如果是这种情况,Scala workaround
版本是否相当于
def sort[A <: Comparable[_]](list: List[A]) { }
他们似乎都为我的用例编译(这是关于在集合中放置不同的子类型并能够对它们进行排序)。 NB。 我对机制以及导致循环参考错误的原因感到好奇,并且意识到Scala在协方差等方面提供了更好的选择(即Ordering
)。
public > void sort(List a)
太过一般,因为那样你可以传入一个List extends Comparable
,其中compare函数不适用于List
类型的值。
你使用你的解决方法走在正确的轨道上,但犯了一个小错误。 它应该是:
def workaround[A <: Comparable[A], U>: A](list: List[U]) { }
但请注意,这不是通常在Scala中解决这种情况的方式:
请参阅scala.math.Ordering
。