Поскольку я нигде не нашел решения своей проблемы, я думаю, что мог бы думать в очень неправильном направлении.
Вот моя проблема: у меня есть черта A и другая черта B и сопутствующие объектыAB1, AB2, AB3 и так далее.Одноэлементные объекты расширяют черту A, а классы расширяют черту B. Многие объекты этих классов находятся в списке.
В этих объектах я хочу использовать функции, определенные в соответствующем одноэлементном объекте, которые принимают объекты одного и того же класса.как объект-одиночка.
Это пример для черт:
trait A {
def compare(firstB: B, secondB: B) : Int
}
trait B {}
И сопутствующих объектов:
class AB1(val variable: Int) extends B {}
object AB1 extends A {
def apply(list: List[Int]): Option[AB1] = {
if(list.foldLeft(0)(_ + _) < 10 && list.nonEmpty)
some(new AB1(list.head))
else
null
}
override def compare(ab11: AB1, ab12: AB1): Int = {
if(ab11 > ab12)
1
else if(ab11 > ab12)
-1
else
0
}
}
и
class AB2(val variable1: Int, val variable2: Int) extends B {}
object AB2 extends A {
def apply(list: List[Int]): Option[AB1] = {
if(list.foldLeft(0)(_ + _) < 20 && list.length >= 2)
some(new AB1(list.head, list.tail.head))
else
null
}
override def compare(ab21: AB2, ab22: AB2): Int = {
if(ab11 > ab12)
10
else if(ab11 > ab12)
-10
else
0
}
}
Итак, я уже отфильтровал некоторые объекты и поместил «реальные» объекты в список, назовем его bList.Для каждого элемента списка я хочу вызвать функцию сравнения.
Я думаю, это выглядело бы примерно так:
val bList: List[B]
val a = getA(bList.head) // getA should be a function that returns the companion object of a class
a.compare(bList.head, bList.tail.head)
На своем пути я столкнулся с двумя проблемами:
b.getClass
не равно AB1.getClass
, когда b является объектом класса AB1.Но это не моя главная проблема.Я нашел решение с использованием сравнения строк, которое на самом деле не очень красиво, но на данный момент оно работает. - Функция
compare
должна быть определена в признаке, потому что в противном случае она не может быть приведена ни к какомуодноэлементный объект, который расширяет черту A. Но я не могу определить функцию с параметрами типа переменной.
Я действительно надеюсь, что вы можете помочь мне с этой проблемой!
РЕДАКТИРОВАТЬ : Теперь я вижу, что забыл упомянуть кое-что:
Я думаю, что мне нужно немного углубиться в то, что я пытаюсь сделать, чтобы вы поняли мою проблему:
У меня есть List[List[C]]
.Список этих C
может быть способен создать объект AB1 с ним, но может быть AB2, или, возможно, AB3 и так далее.Так что у меня есть
val c: List[C] = (C1, C2, C4)
val aList: List[A] = (AB1, AB2, AB3, ...)
val bestB: B = (for{
element <- aList
} yield element (c)).flatten.head // Because the List aList is ordered: AB1 is the best case, AB2 the second best and so on.
Я делаю это для каждого Списка [C] из Списка [List [C]].Так что в итоге у меня может быть List[B] = (AB3, AB1, AB2, AB1)
(например).Из этого списка я хочу сначала получить «лучшие» B
с в порядке aList
, а затем я получу List[B] = (AB1, AB1)
.Эти два AB1
я хочу сравнить, а затем поместить «лучший» элемент (согласно функции сравнения соответствующего объекта) или оба в новый список.Это то, чего я хочу достичь.