【发布时间】:2014-12-11 14:02:35
【问题描述】:
问题:
看this question关于迁移Java签名
public <A extends Comparable<? super A>> void sort(List<A> list) { }
对于 Scala,似乎没有办法避免
illegal cyclic reference involving type T
如果你做这样的直译会出错。
def compilerFailure[T <: Comparable[_ >: T]](a: Array[T]): T = { }
解决方法似乎是这样做
def workaround[A <: Comparable[U], U >: A](list: List[A]) { }
如果你从字节码往返返回 Java,你会得到这个(这会丢失 super 部分)
public <T extends Comparable<U>, U> void scalaToJava(List<U> a) { }
我的问题:
scalaToJava 版本是否等同于以下版本?
public <T extends Comparable<?>> void sort(List<T> a) {
我想当U 是无限的时,它可能是? 或Object 不是吗?那么如果是这样的话,Scala workaround 版本是否等同于
def sort[A <: Comparable[_]](list: List[A]) { }
它们似乎都针对我的用例进行了编译(即将不同的子类型放入集合中并能够对它们进行排序)。 NB。我很好奇机制以及导致循环引用错误的原因,并意识到 Scala 在协方差等方面提供了更好的替代方案(即Ordering)。
【问题讨论】:
-
应该是
def workaround[A <: Comparable[U], U >: A](list: List[A]) { }。List[U]在这里毫无意义,因为您将失去与A的任何关系。