用`?转换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