[英]How to avoid using asInstanceOf in Scala
目前我的代码需要类转换
val dataWriter: BytesDataWriter = createDataWriter
def createDataWriter(p: SomeClass) =
p.create_datawriter().asInstanceOf[BytesDataWriter]
create_datawriter
方法将返回超类DataWriter。 我尝试了这种方法,而不是使用asInstanceOf
进行转换
val dataWriter: BytesDataWriter = createDataWriter(p) match {
case writer: BytesDataWriter => writer
case _ => throw new ClassCastException
}
这太冗长了,如果情况不起作用。 是否有更好的替代类铸造?
如果您可以使用非BytesDataWriter
结果执行某些 BytesDataWriter
,或者为了获得更好的错误消息,您将使用第二种方法:
val dataWriter: BytesDataWriter = p.create_datawriter() match {
case writer: BytesDataWriter => writer
case other => throw new Exception(s"Expected p to create a BytesDataWriter, but got a ${other.getClass.getSimpleName} instead!")
}
否则,请使用asInstanceOf
。
Alexey Romanov的答案对于您的具体情况是一个很好的建议。 或者,您可以通过更改周围代码的结构来避免这种情况。
当您使用类并实例化它时,看起来您正在实现某种可配置的依赖项处理。 这是一个复杂的问题,但幸运的是有一些很好的解决方案:
您可以使用某种依赖注入并使用专用类型注入所需的ByteDataWriter
。 查看Google Guice FAQ中描述的“机器人腿”示例,了解如何处理同一基类的不同变体,以及如何处理泛型 。 这可以帮助您避免DataWriter
和ByteDataWriter
问题。
您还可以使用协议访问DataWriter
(或者在Scala中使用: 结构类型 )。 在编译时不会检查结构类型,因此不需要类强制转换。
或者您可以使用Scala专业处理依赖项: 蛋糕模式 。 有了这种模式,您可以根据需要撰写课程。 您可以设计需要ByteDataWriter
的类完全类型安全。 然后编译器将确保它只能与正确的类组合。 不需要课堂演员。 缺点是,您无法使用配置文件重新配置依赖项。 但通常这不是必需的,因为支持的变体在编译时是众所周知的。
如果您有选项,请考虑使用上述方法之一重新设计代码,以摆脱类强制转换。 很可能您在代码中的许多其他位置都会遇到同样的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.