Scala анонимное несоответствие типов классов - PullRequest
0 голосов
/ 05 октября 2010

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

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 ]

2 голосов
/ 06 октября 2010

Ну, переданный ввод не равен предоставленному вводу, верно? print нужен A:

def print(a: A) = {

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

val min = new Comparable[A] {

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

Так что, в принципе, измените свой алгоритм.

0 голосов
/ 06 октября 2010

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

  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)
    }
}

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

...