我如何使这种模式有效? func()无法编译。我理解这个设置的问题,但是什么样的模式基本上可以实现呢?
class A() {
val a: Int = 123
val b: String = "xxx"
}
def func[T](key: String, a: A): T = {
if (key == "a") a.a // would make T an Int
else if (key == "b") a.b // would make T a String
}
val a = new A()
func[Int]("a", a)
func[String]("b", a)
答案 0 :(得分:3)
我不太确定你的目的是什么,但有一些可能性。
class A() {
val a: Int = 123
val b: String = "xxx"
}
def func[T : Manifest](a: A) = implictly[Manifest[T]] match {
case implicitly[Manifest[Int]]) => a.a
case implicitly[Manifest[String]) => a.b
}
val a = new A()
func[Int](a)
func[String](a)
或
class A() {
val a: Int = 123
val b: String = "xxx"
}
val aKey = (_: A).a
val bKey = (_: A).b
def func[T](key: A => T, a: A) = key(a)
val a = new A()
func(aKey, a)
func(bKey, a)
甚至是Shapeless,
import shapeless._
import syntax.singleton._
import record._
val a = ("a" ->> 123) :: ("b" ->> "xxx") :: HNil
a("a") // typed as an Int
b("b") // typed as a String
答案 1 :(得分:2)
也许这接近你之后的事情?
class A() {
val a: Int = 123
val b: String = "xxx"
}
def func(key: String, a: A): Either[Int,String] = {
if (key == "a") Left(a.a)
else Right(a.b)
}
val a = new A()
func("a", a) // Left(123)
func("b", a) // Right("xxx")