Проблема:Преобразование Java `sort` подписи с`? супер T` в Scala (дженерики)
Глядя на 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 [A]) {}'. 'List [U]' не имеет смысла здесь, потому что вы потеряете какое-либо отношение к 'A'. –