2010-10-05 5 views
0

Я создаю список, содержащий объекты Comparable, и хочу создать один объект, который служит минимальным списком, так что он всегда возвращает -1 для своего метода compareTo. Другие методы в списке, как print здесь требует ввода типа А. Если я скомпилировать код, я получаю следующее сообщение об ошибке:Scala anonymous тип класса несоответствие

error: type mismatch; 
found : java.lang.Object with java.lang.Comparable[String] 
required: String 
l.print(l.min) 

Кто-нибудь есть какие-либо идеи о том, как может создать такой минимальный элемент, так что всегда меньше, чем любые другие элементы в списке?

class MyList[A <: Comparable[A]] { 
    val min = new Comparable[A] { 
    def compareTo(other: A) = -1 
    } 

    def print(a: A) = { 
    println(a) 
    } 
} 

class Run extends Application { 
    val l = new MyList[String] 
    l.print(l.min) 
} 

ответ

2

Ну, входной сигнал не соответствует введенному входу, не так ли? print нуждается в A:

def print(a: A) = { 

И min не возвращать A:

val min = new Comparable[A] { 

Как создать такой A, как вы хотите ... как ты мог это сделать? Вы ничего не знаете о A - вы не знаете, что возвращает его toString, вы не знаете, какие методы он реализует и т. Д.

Итак, в основном, измените свой алгоритм.

0

Вы получаете ошибку компиляции, потому что вы пытаетесь использовать Сопоставимые где компилятор ожидает А, что вы на самом деле хотите сделать это:

val min: A = new A { 
    def compareTo(other: A) = -1 
    } 

, но вы не можете сделать это в Scala (или Java), потому что вы пытаетесь создать объект неизвестного типа (A). Вы могли бы делать это с помощью отражения, но у вас все еще возникла бы проблема создания объекта, который был меньше любого другого объекта в списке.

Кроме того, имейте в виду, что ваша реализация compareTo будет иметь проблемы с почти любым алгоритмом сортировки, который вы выберете, потому что вы не можете гарантировать, что compareTo всегда вызывается из min. Например, вы могли бы получить:

min.compareTo(list(0)) // returns -1 
list(0).compareTo(min) // could be anything really 

Если вы хотите получить список, который возвращает конкретный объект как «минимум», то вы могли бы просто предварять определенное значение для отсортированного списка:

class MyList2[A <: Comparable[A]] { 
    val min: A; // somehow create an instance of the class A 
    val list: List[A] 

    def sort(fn: (A, A) => Boolean) = { 
     min :: list.sort(fn) 
    } 
} 

но как говорит Даниэль, это, вероятно, неправильный путь.

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