我需要解析一些消息.消息的前4个字节标识消息的类型,因此,使用它,我可以实例化正确类型的对象.为了使这个有效的操作,我想我会创建一个哈希映射,其中键是前4个字节,值是对象构造函数.我可以只查找构造函数并调用它.
毕竟,构造函数只是函数,将函数放在映射中应该没有任何问题.事实证明,我遇到了一些困难,因为我不知道如何正确地表达对构造函数的引用.
为了得到一个简单的例子,假设我们有一个消息基类MsgBase,和几个子类,MsgA和MsgB.如果我为每个消息创建一个伴随对象并将一个工厂函数放入其中,我可以使用这些函数使数组没有任何问题.
这是一个简化的示例,它将消息作为字符串.
class MsgBase(message: String) { }
class MsgA(message: String) extends MsgBase(message) { }
object MsgA { def makeIt(message: String): MsgA = new MsgA(message) }
Run Code Online (Sandbox Code Playgroud)
和哪里MsgB相似.然后我可以制作地图:
val cm = Map[String, (String) => MsgBase]("a" -> MsgA.makeIt, "b" -> MsgB.makeIt)
val myMsg = cm("a")("a.This is the message")
Run Code Online (Sandbox Code Playgroud)
看起来我应该能够在构建映射的表达式中直接引用消息对象构造函数,而不是在伴随对象中使用普通函数,但我还没有想出任何表达方式.有办法吗?
我有一个Scala测试项目,该项目将一些信息写入mysql数据库。我使用sbt设置了项目,并使用sbt-eclipsify以便可以从eclipse运行它。我还使用了sbt插件sbt-assembly来创建一个单个jar,其中包含我需要的依赖jar中的所有类。我可以从eclipse和sbt正常运行程序。
我从sbt-assembly构建的单个jar中运行它:
java -classpath target/test1-assembly-1.0-SNAPSHOT.jar example.InsertDataIntoDatabase
Run Code Online (Sandbox Code Playgroud)
但是它失败了:
找不到适用于jdbc:mysql:// localhost:3306 / test的驱动程序
我的第一个想法是sbt-assembly可能错过了mysql驱动程序的依赖关系,但是我解压缩了jar,并在其中找到了com / mysql / jdbc / Driver.class。
还有其他依赖可能会丢失吗?
如何解决呢?