问题:
看着这个问题 https://stackoverflow.com/questions/16430355/translating-generic-%20wildcards-from-java-to-scala关于迁移 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
part)
public <T extends Comparable<U>, U> void scalaToJava(List<U> a) { }
我的问题:
Is the scalaToJava
版本相当于以下?
public <T extends Comparable<?>> void sort(List<T> a) {
我想当U
是无界的,也可能是?
or Object
不?那么如果是这样的话,就是Scalaworkaround
版本相当于
def sort[A <: Comparable[_]](list: List[A]) { }
它们似乎都是针对我的用例进行编译的(即将不同的子类型放入集合中并能够对它们进行排序)。NB.我很好奇其机制以及导致循环引用错误的原因,并意识到 Scala 在协方差等方面提供了更好的替代方案(即Ordering
).