2016-08-02 84 views
1

我将如何使此模式起作用? func()无法编译。我理解这个设置的问题,但是基本上可以实现的模式是什么?返回值的scala多态类型

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) 
+1

你是什么意思 “基本上做到这一点” 呢?这不是一种模式,这是不可能的。 –

回答

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