问题:
查看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中解决这种情况的方式:
原文地址:https://codeday.me/bug/20190624/1276946.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。