繁体   English   中英

如何避免在Scala中使用asInstanceOf

[英]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中描述的“机器人腿”示例,了解如何处理同一基类的不同变体,以及如何处理泛型 这可以帮助您避免DataWriterByteDataWriter问题。

鸭打字

您还可以使用协议访问DataWriter (或者在Scala中使用: 结构类型 )。 在编译时不会检查结构类型,因此不需要类强制转换。

蛋糕模式

或者您可以使用Scala专业处理依赖项: 蛋糕模式 有了这种模式,您可以根据需要撰写课程。 您可以设计需要ByteDataWriter的类完全类型安全。 然后编译器将确保它只能与正确的类组合。 不需要课堂演员。 缺点是,您无法使用配置文件重新配置依赖项。 但通常这不是必需的,因为支持的变体在编译时是众所周知的。

结论:尽可能尝试重新配方

如果您有选项,请考虑使用上述方法之一重新设计代码,以摆脱类强制转换。 很可能您在代码中的许多其他位置都会遇到同样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM