微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用`?转换Java`sort`签名超级T`到Scala(仿制药)

问题:

查看this question有关迁移Java签名的信息

public <A extends Comparable<? super A>> void sort(List<A> list) { }

对Scala来说,似乎没有办法避免

涉及T类的非法循环引用

如果你做这样的字面翻译会出错.

def compilerFailure[T <: Comparable[_ >: T]](a: Array[T]): T = { }

解决方法似乎是这样做

def workaround[A <: Comparable[U], U >: A](list: List[A]) { }

如果你从字节码回程到Java,你得到这个(它失去了超级部分)

public <T extends Comparable<U>, U> void scalaToJava(List<U> a) { }

我的问题:

scalaToJava版本是否等效于以下内容

public <T extends Comparable<?>> void sort(List<T> a) {

我想当U无界时,它可能也是?或对象否?然后,如果是这种情况,Scala解决方法版本是否相当于

def sort[A <: Comparable[_]](list: List[A]) { }

它们似乎都为我的用例编译(这是关于在集合中放置不同的子类型并能够对它们进行排序). NB.我对机制以及导致循环参考错误的原因感到好奇并且意识到Scala在协方差等方面提供了更好的替代方案(即订购).

解决方法:

public <T extends Comparable<?>> void sort(List<T> a)

太过一般,因为那样你可以传递List< A> extends Comparable< Int>其中比较函数不适用于List< A>类型的值.

你的解决方法在正确的轨道上,但犯了一个错误.它应该是:

def workaround[A <: Comparable[A], U >: A](list: List[U]) { }

但请注意,这不是通常在Scala中解决这种情况的方式:

scala.math.Ordering.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐