Во-первых, некоторые фон:Кастинг объекта Scala в общий тип?
В настоящее время я пишу общий решатель для определенного класса проблем (в частности, структурный решатель SVM) в Scala. Чтобы использовать это, пользователь должен реализовать интерфейс.
Рассмотрим упрощенную версию интерфейса:
trait HelperFunctions[X, Y] {
def func1(x: X, y: Y): Y
def func2(y1: Y, y2: Y): Int
}
и простую реализацию: (. Обратите внимание, что реализация имеет которая должна быть предоставлена в форме объекта)
object ImplFunctions extends HelperFunctions[Vector[Double], Double] {
def func1(x: Vector[Double], y: Double): Double = { ... }
def func2(y1: Double, y2: Double): Int = { .. }
}
Теперь проблема: Мне нужно написать диагностический набор, который помогает пользователю проверить разумность его функций. Пример теста на здравомыслие будет включать в себя нечто вроде func1(..)
, являющееся положительным для всех x
и y
. Для этого я изложил, написав блок-тесты стиля BDD, используя ScalaTest.
Обратите внимание, что диагностический набор должен быть общим, чтобы работать с любым объектом, который расширяет HelperFunctions[X, Y]
. Высокоуровневая картина того, как я планировал это сделать: сначала предоставив все тесты на чувствительность, разработанные для общего назначения X
и Y
. Затем пользователь просто заменяет, скажем ???
, ImplFunctions
и запускает пакет.
Но, оказывается, я не нашел изящного подхода к лечению ImplFunctions
как общего HelperFunctions[X, Y]
. Вот вкус того, что я пытался до сих пор:
import org.scalatest._
class ApplicationDiag extends FlatSpec {
// Option 1:
// Cast the ImplFunctions into a generic type
// ERROR: type mismatch; found : ImplFunctions.type, required : HelperFunctions[X, Y]
val helpers: HelperFunctions[X, Y] = ImplFunctions
// OR
def helpers[X, Y](): HelperFunctions[X, Y] = ImplFunctions
// Option 2: User fills up the right side, no type specified for the value
// WORKS. But, cannot explicitly state types
val helpers = ImplFunctions
"func1" should "be positive" in {
// ... the check as described previously
}
}
Благодаря ковариационной природе, я предполагаю, что это должно быть возможным привести экземпляр типа к его надтипу. Но это кажется более жестким, поскольку это связано с генериками. Есть ли чистый способ сделать это?
Примечание: 1. Я полностью открыт для альтернативных конструкций диагностического набора. 2. реальный интерфейс: HelperFunctions и в реальном мире приложений: ImplFunctions
Если вы хотите, чтобы ваши типы были совпадающими или противоречивыми, вы должны объявить их как таковые с помощью синтаксиса '+ X' /' -X'. Вам не нужно бросать. – lmm