2014-10-16 2 views
4

Проблема:Преобразование 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).

+0

это должно быть 'def workaround [A <: Comparable [U], U>: A] (список: List [A]) {}'. 'List [U]' не имеет смысла здесь, потому что вы потеряете какое-либо отношение к 'A'. –

ответ

4
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.

+0

Спасибо. Итак, чтобы ответить на мой вопрос, вы говорите «Нет» подстановочную версию Java? Я подозреваю, что компилятор Scala делает больше и оставляет тип неограниченным в байтовом коде.Поэтому сравнение байтового кода/кругового отключения может не иметь смысла в этом случае ... – Toby

Смежные вопросы