scala - 如何获得具有下限的 Class[_ <: A]]
问题描述
你好)我在Java中有一个抽象类和几个具体类
abstract class SpecificRecordBase {}
class A extends SpecificRecordBase
class B extends SpecificRecordBase
....
我也有一张 Scala 地图。我想把键字符串和值作为一个类在方法中使用它:
def test(m: Map[String, Class[_ <: SpecificRecordBase]]):Unit = ???
我试图 ClassTag(ClassLoader.getSystemClassLoader.loadClass(stringClassName)).runtimeClass 但出现错误。我也尝试创建方法并使用它
def getClass[T <: SpecificRecordBase](ct: ClassTag[T]): Class[T] = ct.runtimeClass
And also have an error
Error:(10, 73) type mismatch;
found : Class[_$1] where type _$1
required: Class[T]
def getClass[T <: SpecificRecordBase](ct: ClassTag[T]): Class[T] = ct.runtimeClass
请问你能帮帮我吗?
解决方案
问题是签名runtimeClass
:
def runtimeClass: Class[_]
表示类型 U 的类,T 将被擦除到。请注意,T 和 U 之间没有子类型关系。
原因是 , 等类型Any
。Nothing
但实际上,ClassTag
在这里没有用,因为您正在做的事情ClassTag(<something>).runtimeClass
可以简化为<something>
.
所以只需投射它:
ClassLoader.getSystemClassLoader.loadClass(stringClassName).asInstanceOf[Class[_ <: SpecificRecordBase]]
(编辑:正如马里奥·加利奇指出的那样,这应该是
ClassLoader.getSystemClassLoader.loadClass(stringClassName).asSubclass(classOf[SpecificRecordBase])
下面应用了类似的更改。)
甚至更简单
Class.forName(stringClassName).asSubclass(classOf[SpecificRecordBase])
如果您不确定是否会获得 的子类型SpecificRecordBase
,可以对其进行测试:
val cls = Class.forName(stringClassName)
Try { cls.asSubclass(classOf[SpecificRecordBase]) } match {
case Success(cls1) =>
// handle a subclass
case Failure(_) =>
// handle a non-subclass
}
或者没有异常处理
val cls = Class.forName(stringClassName)
if (classOf[SpecificRecordBase].isAssignableFrom(cls)) {
val cls1 = cls.asInstanceOf[Class[_ <: SpecificRecordBase]]
// handle a subclass
} else {
// handle a non-subclass
}
推荐阅读
- reactjs - 在其他一些实用程序方法中内部调用承诺时酶测试用例失败
- android - How do I access the children in my firebase database and display them in the activity according to the listview item selected
- xcode - UITableViewCell 中的自动布局失败
- java - JAVA - 在测试 SOAP Web 服务时从 SOAP UI 获取空值
- kubernetes - 是否可以将小型 Kubernetes 配置组合成一个大型配置
- css - 应用程序 UI 中的移动设备联系人列表
- java - Tomcat进程未关闭
- python - Python - tkinter 和 glob.glob 一起工作
- openmp - openmp 中的依赖部分
- google-chrome - 如何更改谷歌浏览器扩展中的下载文件夹?