class Config(sourceName :String, storeClass :Class[_]) {
def store = storeClass.getConstructor(classOf[Configuration]).newInstance(sourceName)
def write(k :String, v :String) {
store.writeTo(k,v)
}
def read(k :String): Unit ={
store.readFrom(k)
}
def contains(k :String) :Boolean ={
store.isContains(k)
}
}
这里Configuration
是父抽象类,他们有一些子类。
因此class config
中的第二个参数可以是任何子class Configuration
。
每个子类在启动时采用参数ie; sourceName
。
storeClass.getConstructor(classOf[Configuration]).newInstance(sourceName)
以上代码返回类型:Any
,这会产生问题,因为我需要它是Configuration
类型
def store :Configuration
属于Configuration
类型,否则read
,write
和contains
无法正常工作!
答案 0 :(得分:2)
使用.asInstanceOf[Configuration]
投射它。使用反射时,您必须要打破类型安全。
答案 1 :(得分:2)
getConstructor
方法选择一个构造函数,该构造函数接受您提供它的类的参数。从您的代码中可能看起来您需要一个接受String
的构造函数,因此您可能希望执行以下操作:
storeClass.getConstructor(classOf[String])
.newInstance(sourceName)
.asInstanceOf[Configuration]
但我不确定这是否是您尝试解决的问题的理想解决方案。运行时反射和Class[_]
对象不是Scala-esque ......