我需要根据应用程序中特定参数的值来实例化一个不同的类。类似的东西:
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")
任何想法如何做到这一点或是否可能?它尝试了上面的代码,我得到了输出的类型不匹配,所以它可能就像正确指定输出类型一样简单,我很确定我不是。
感谢。
答案 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]
}