从Scala中的函数返回一个类

时间:2017-05-15 16:24:17

标签: scala

我需要根据应用程序中特定参数的值来实例化一个不同的类。类似的东西:

class x { val z = 5}
class y { val z = 10}

def myClass(input:String): Class[_] = {
  input match{
    case "x" => x
    case "y" => y
  }
 }

 val a = new myClass("x")

任何想法如何做到这一点或是否可能?它尝试了上面的代码,我得到了输出的类型不匹配,所以它可能就像正确指定输出类型一样简单,我很确定我不是。

感谢。

2 个答案:

答案 0 :(得分:2)

你应该澄清你想要完成的事情,因为运行时反射会允许你这样做,但99.9%的时间是你解决问题的错误方法。

您可以执行以下操作:

get()

答案 1 :(得分:0)

目前还不清楚你实际上要做的是什么:一方面,你说你需要实例化类,另一方面,你的函数被声明为返回{ {1}}本身,而非实例。

所以,如果你试图创建一个实例,这样的东西就可以了:

Class

注意:此功能有两个问题。首先,如果输入恰好既不是 def myClass(input: String): AnyRef = input match { case "x" => new x case "y" => new y } 也不是x,它将抛出异常...这不是很好。最好让它返回y,并在输入不匹配时将默认值添加到None:

Option

另一个问题是你不能对这个函数返回的值做很多的写法,因为你不知道它有什么类型,所以,你不能访问它的任何成员(除了常见的内容包括 def myClass(input: String): Option[_] = Option(input) collect { case "x" => new x case "y" => new y } toString等。

最好定义一个像其他答案所暗示的共同特征,并将函数的返回类型缩小到该特征:

equals

最后,如果你想要的是实际返回trait Foo { def z: Int } class x extends Foo { val z = 5 } class y extends Foo { val z = 10 } def myClass(input: String): Option[Foo] = Option(input) collect { case "x" => new x case "y" => new y } 对象而不是实例,那么你几乎拥有它,除了你需要添加一个Class关键字(它仍然更好如果输入不匹配,则使结果可选):

classOf

或者,更好的是,类型边界:

 def myClass(input: String): Option[Class[_]] = Option(input) collect {
   case "x" => classOf[x]
   case "y" => classOf[y]
 }