Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 具有相同参数化类型的Scala mixin_Design Patterns_Scala - Fatal编程技术网

Design patterns 具有相同参数化类型的Scala mixin

Design patterns 具有相同参数化类型的Scala mixin,design-patterns,scala,Design Patterns,Scala,我对scala非常陌生,适应scala特定模式的探索正在进行中。 目标是分离消息处理和消息生成。存在表示消息处理的基本协变参数化类型。具体实现可以通过常规mixin或混合底层协议来组合 要求如下: 尽可能简单地扩展 确保类型安全,以防止愚蠢的错误 我附带了干净的示例代码(包含定义和使用): 我已经构建了一个灵活的系统,它具有简单的组合和扩展,但是使用scala的case类而不是alegraic类型时,它的类型安全性尽可能高 我几乎实现了我的目标,但遇到了一个巨大的scala故障:底层jvm的类型

我对scala非常陌生,适应scala特定模式的探索正在进行中。 目标是分离消息处理和消息生成。存在表示消息处理的基本协变参数化类型。具体实现可以通过常规mixin或混合底层协议来组合

要求如下:

  • 尽可能简单地扩展

  • 确保类型安全,以防止愚蠢的错误

  • 我附带了干净的示例代码(包含定义和使用):

    我已经构建了一个灵活的系统,它具有简单的组合和扩展,但是使用scala的case类而不是alegraic类型时,它的类型安全性尽可能高

    我几乎实现了我的目标,但遇到了一个巨大的scala故障:底层jvm的类型擦除。我使用的构造对于scala是非法的,因为我希望参数化的trait可以用“with”子句扩展

    编译器抱怨

    mixed.scala:53: error: illegal inheritance;
    class ArithmAccum inherits different type instances of trait Handler:
    Handler[ProdMsg] and Handler[SumMsg]
    class ArithmAccum (var store: Int) extends SumHandler with MulHandler
    

    我有什么选择?我不能使用我设计的模式,我需要用可用性找到一个同等的替代品。有人可以推荐其他源代码解决方案吗?是否存在Scala插件(它们似乎是编译器存在的)或是将Scala参数化类型的后端从java泛型转换为C++类代码生成的另一种方法?

    < p>您的问题不是JVM的类型删除,而是斯卡拉使用线性化来解决继承。
    删除类型参数[+proto,但这样会丢失类型安全性。第四个示例将在非法时编译,但您的类型安全性只是虚构的。handle方法未使用类型参数proto,因此您无法确保处理程序[a]确实可以处理A型协议。而且,我认为您当前的解决方案并没有按照您的预期工作。在对象3中,您使用ProdMsg定义了类型Proto=summasg。这意味着它只接受既是Sums又是Prods的协议。但您可能需要的是Sums或Prods。如果我没记错的话,您无法轻松地在Scala.Ha中编码这样的类型ndle如果协变,那么
    处理程序[SumMsg with ProdMsg]
    处理程序[SumMsg]
    的一个子类型,使用它是正确的。我不能暗示方法句柄的具体类型,因为在这种情况下它不会协变。所以我不得不使用非类型的
    部分函数[Protocol,Unit]
    而不是
    部分函数[proto,Unit]这个例子是相当同步的,在实际的代码中,我使用Akka的演员来进行消息分发,AkKa的接收类型签名(PudialStale[One,Ung])是另一个限制,抱歉,我不认为汉德勒是协变的。但是你是否认为这意味着你可以在需要处理程序的地方提供一个处理程序[SAMS]?我无法想象这是你真正想要的。我也有同样的问题。F**k JVM。
    
    mixed.scala:140: error: type mismatch;
    found   : Handler[Four.Proto]
    required: Handler[ProdMsg]
      override def getProducer(accum : Handler[Proto]) = new ProduceProds(accum)
    
    mixed.scala:53: error: illegal inheritance;
    class ArithmAccum inherits different type instances of trait Handler:
    Handler[ProdMsg] and Handler[SumMsg]
    class ArithmAccum (var store: Int) extends SumHandler with MulHandler