scala多态类型的返回值

时间:2016-08-02 00:39:23

标签: scala function polymorphism

我如何使这种模式有效? 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)

2 个答案:

答案 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")