Отказ от ответственности:Это вопрос о том, что возможно, а не то, что будет рекомендовано на практике.Структурные Тип Параметры в Scala Коллекции
Допустим, вы дали следующие классы:
case class point1(x: Int, y:Int)
case class point2(x: Int, y:Int)
case class point3(x: Int, y:Int)
и у вас есть списки, содержащие некоторое количество каждого класса
val points1 = List[point1](/*Can be empty for this example*/)
val points2 = List[point2]()
val points3 = List[point3]()
является возможность создать список структурного типа который может содержать все три типа точек, используя обычные методы, такие как ++
, :::
или .union(..)
, не определяя общий признак, который распространяется на все классы, т.е.
var points: List[{def x: Int; def y: Int}] =
points1 ::: points2 ::: points3
Я понимаю, что как указано выше, оператор :::
возвращает List[Product]
. Я предполагаю, что это вопрос обеспечения правильных подсказок компилятора Scala, так как следующий код действительно производит список нужного типа:
var points: ListBuffer[{def x: Int; def y: Int}] = List[{def x: Int; def y: Int}]()
points1.foreach(e => {
val p: {def x: Int; def y: Int} = e;
points.append(p);
})
points2.foreach(e => {
val p: {def x: Int; def y: Int} = e;
points.append(p);
})
Существуют ли какие-то намеки, я могу дать, чтобы помочь компилятору Scala, чтобы выбрать правильный тип для :::
и составить список указанного структурного типа?
У вас есть ответ, но имейте в виду, что стоимость вызова метода (или доступ к свойству, что является одним и тем же) значительно выше при использовании структурного типа. –
@RandallSchulz Спасибо, как я заявил в ** отказ от ответственности **, это не используется на практике, а просто мысленный эксперимент о том, что возможно с системой структурного типа Scala и выводом. Я понимаю, что сочетание структурной типизации, особенно с неявными преобразованиями, может иметь серьезные последствия для производительности. – Syllepsis