首页 > 解决方案 > Scala 无法解决复杂生成代码中的类型不匹配问题

问题描述

我有以下设置,我试图通过代码的编译类型检查,最好进行最少的修改,因为代码是由工具而不是手动生成的。

我认为问题是我需要为 M_TEST_COLL 中的 T_MAX_LATTICE[T] 或 T_IntegerMaxLattice 提出更好的定义。

代码有点大,所以我不能在这里发布整个代码,但我把 repo URL 放在了底部。我正在努力可视化类型层次结构。

我知道这个问题太笼统了,但我所寻找的只是能够在不使用 uncheck cast 和对运行时代码(或 basic.handcode.scala)的最小修改的情况下编译代码

错误(1 和 2):

Type mismatch. Required:
  C_NUMERIC [ T_IntegerMaxLattice ] 
  Found: M_MAX_LATTICE [ T_Integer ] 


Type mismatch. Required:
   C_NUMERIC [ T_IntegerMaxLattice ] 
   Found: M_MAX_LATTICE [ T_Integer ] 

生成的代码:

问题 1:

class M_TEST_COLL[T_T](name : String,val t_T : C_TYPE[T_T] with C_TINY[T_T])
  extends Module(name)
    with C_TEST_COLL[T_T,T_T]
{
  type T_Result = T_T;
  val v_equal = t_T.v_equal;
  val v_string = t_T.v_string;
  val v_assert = t_T.v_assert;
  val v_node_equivalent = t_T.v_node_equivalent;
  type T_Root = t_T.T_Root;
  val t_Root = t_T.t_Root;
  type T_Wood = t_T.T_Wood;
  val t_Wood = t_T.t_Wood;
  val p_root = t_T.p_root;
  val v_root = t_T.v_root;
  val p_branch = t_T.p_branch;
  val v_branch = t_T.v_branch;
  val p_leaf = t_T.p_leaf;
  val v_leaf = t_T.v_leaf;

  val t_Result : this.type = this;
  val t_IntegerMaxLattice = new M_MAX_LATTICE[T_Integer]("IntegerMaxLattice",t_Integer,0);
  type T_IntegerMaxLattice = /*TI*/T_MAX_LATTICE[T_Integer];
  private class E_foo(anchor : Null) extends Evaluation[Null,T_IntegerMaxLattice](anchor,"foo") {
    override def getDefault = new M__basic_4[ T_IntegerMaxLattice](t_IntegerMaxLattice).v__op_s(1,2);
    override def compute : ValueType = c_foo();
  }

问题2:

  def c_foo() : T_IntegerMaxLattice = {
    Debug.begin("foo");
    try {
      return new M__basic_4[ T_IntegerMaxLattice](t_IntegerMaxLattice).v__op_s(1,2);
    } finally { Debug.end(); }
  }

回购网址

标签: scalagenericstypes

解决方案


尝试M_MAX_LATTICE不仅C_TYPE像上一个问题一样进行扩展,而且C_NUMERIC

class M_MAX_LATTICE[T_TO]
(name : String, t_TO:C_ORDERED[T_TO],v_min_element : T_TO)
  extends M_MAKE_LATTICE[T_TO](name,t_TO,v_min_element,
    new M__basic_3[ T_TO](t_TO).v__op_z,
    new M__basic_3[ T_TO](t_TO).v__op_z0,
    new M__basic_13[ T_TO](t_TO).v_max,
    new M__basic_13[ T_TO](t_TO).v_min)
    with C_MAX_LATTICE[T_TO,T_TO] with C_ORDERED[T_TO]
    with C_TYPE[T_TO] with C_NUMERIC[T_TO]
{
  val v_less = t_TO.v_less;
  val v_less_equal = t_TO.v_less_equal;
  override val v_assert: T_TO => Unit = ???
  override val v_node_equivalent: (T_TO, T_TO) => T_OrLattice = ???
  override val v_string: T_TO => String = ???
  override def v_zero: T_TO = ???
  override def v_one: T_TO = ???
  override val v_plus: (T_TO, T_TO) => T_TO = ???
  override val v_minus: (T_TO, T_TO) => T_TO = ???
  override val v_times: (T_TO, T_TO) => T_TO = ???
  override val v_divide: (T_TO, T_TO) => T_TO = ???
  override val v_unary_plus: T_TO => T_TO = ???
  override val v_unary_minus: T_TO => T_TO = ???
  override val v_unary_times: T_TO => T_TO = ???
  override val v_unary_divide: T_TO => T_TO = ???
}

推荐阅读