Здравствуйте, mini_root_2, Вы писали:
__>Хорошо возможно это я ступил, тогда подскажите мне как можно например сделать что-то такое
Дело в том, что A — это тип, а match работает с объектами.
По этому можно сделать иначе
object pm4 extends Application {
class ResultSet {
def getInt(col: int): int = 1
def getDouble(col: int): double = 1.0
def getString(col: int): String = "Hello"
def value[A](col: int)(implicit f: (ResultSet, int) => A): A = f(this, col)
}
implicit def viewRsToInt(rs: ResultSet, col: int): int = rs.getInt(col)
implicit def viewRsToDouble(rs: ResultSet, col: int): double = rs.getDouble(col)
implicit def viewRsToString(rs: ResultSet, col: int): String = rs.getString(col)
val rs = new ResultSet
// Указываем чего точно хочем
val i = rs.value[int](1)
println(i);
val s = rs.value[String](2)
println(s);
// через абстрактный тип T
type T = double
val t = rs.value[T](3)
println(t)
}
$ scalac -d target pm4.scala
$ scala -cp target pm4
1
Hello
1.0
Или посмотреть как это реализованно в scala-dbc. Там запросы имеют вид
select (
"age" is smallint,
"name" is clob,
"salary" is int )
from ("persons" naturalJoin "employees")
where (
"gender" == "M" and
("city" == "lausanne" or "city" == "geneva"))
orderBy "age"
Вариант, приведенный тобой работать не будет, т.к. информация о типе стирается, а значит в рантайме A грубо говоря AnyRef (аналог Object)
__>Какой вообще формат у case можеть быть в различных случаях? Я видел: case x: String, case </element> и др. Но общей сути так и не понял. В ScalaReferences написано что-то типа case e1 => p1 — ну и что такое e1, и каким оно может быть в разных ситуациях?
case может иметь несколько видов (при чем части выражения, например vc или v могут опускаться, если нет необходимости работать с сами заматченым объектом, а например только с параметрами ca1, ca2)
case vc: CaseClass(ca1, ca2) — где параметры конструктора исползовавшиеся при конструировании case классов (специальный вид классов)
case v: ClassName — фактически оптимизированный instanceOf с последующим преведением и присвоением val v = matchVal.asInstanceOf[ClassName]
scala> class U(val v: int) {}
scala> val m=new U(1)
m: U = U@5a936b
scala> m match { case l: U => println("" + l + " " + m) }
line6$object$$iw$$iw$U@5a936b line6$object$$iw$$iw$U@5a936b
Есть еще конструкции с экстраторами и анонимными фукнциями.
Но основное надо помнить: информации о типах нет (erasure как в java) по этому весь match работает только над объектами и константами.