【问题标题】:Scala failing to resolve a type mismatch problem in a complicated codeScala 无法解决复杂代码中的类型不匹配问题
【发布时间】:2020-05-24 20:33:03
【问题描述】:

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

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

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

我知道这个问题太笼统了,但我正在寻找的是能够在不使用 uncheck cast(或asInstanceOf)的情况下编译代码

type T_MAX_LATTICE[T] = T;

trait C_TEST_COLL[T_Result, T_T] extends C_TYPE[T_Result] with C_TINY[T_Result] {
  type T_IntegerMaxLattice;
  val t_IntegerMaxLattice : C_TYPE[T_IntegerMaxLattice] with C_MAX_LATTICE[T_IntegerMaxLattice,T_Integer];
  type T_Integers;
  val t_Integers : C_TYPE[T_Integers]with C_SET[T_Integers,T_Integer];


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]
{
  val t_Result : this.type = this;
  val t_IntegerMaxLattice = new M_MAX_LATTICE[T_Integer]("IntegerMaxLattice",t_Integer,0);
  type T_IntegerMaxLattice = T_MAX_LATTICE[T_Integer];

我得到的错误:

 Error:Error:line (42)type mismatch;
 found   : M_MAX_LATTICE[basic_implicit.T_Integer]
    (which expands to)  M_MAX_LATTICE[Int]
 required: C_TYPE[M_TEST_COLL.this.T_IntegerMaxLattice] with C_MAX_LATTICE[M_TEST_COLL.this.T_IntegerMaxLattice,basic_implicit.T_Integer]
    (which expands to)  C_TYPE[Int] with C_MAX_LATTICE[Int,Int]
  val t_IntegerMaxLattice = new M_MAX_LATTICE[T_Integer]("IntegerMaxLattice",t_Integer,0);

Repo url

【问题讨论】:

标签: scala generics types


【解决方案1】:

我想我创建了最小的例子

  type T_MAX_LATTICE[T] = T;

  trait C_TEST_COLL[T_Result, T_T] extends C_TYPE[T_Result] with C_TINY[T_Result] {
    type T_IntegerMaxLattice;
    val t_IntegerMaxLattice: C_TYPE[T_IntegerMaxLattice] with C_MAX_LATTICE[T_IntegerMaxLattice, T_Integer];
    type T_Integers;
    val t_Integers: C_TYPE[T_Integers] with C_SET[T_Integers, T_Integer];
  }

  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] {
    val t_Result: this.type = this;
    val t_IntegerMaxLattice = new M_MAX_LATTICE[T_Integer]("IntegerMaxLattice", /*t_Integer,*/ 0);
    type T_IntegerMaxLattice = T_MAX_LATTICE[T_Integer];

    val t_Integers = ???/*new M_SET[T_Integer]("Integers",t_Integer);*/
    type T_Integers /*= /*TI*/T_SET[T_Integer];*/
  }

  trait C_TYPE[T_Result] /*extends C_BASIC[T_Result] with C_PRINTABLE[T_Result]*/
  trait C_TINY[T_Result] extends C_TYPE[T_Result]
  trait C_MAX_LATTICE[T_Result, T_TO] /*extends C_MAKE_LATTICE[T_Result,T_TO]*/
  type T_Integer = Int
//  val t_Integer = new M_INTEGER("Integer")
  trait C_SET[T_Result, T_ElemType] extends C_TYPE[T_Result] /*with C_COMPARABLE[T_Result] with C_COLLECTION[T_Result,T_ElemType] with C_ABSTRACT_SET[T_Result,T_ElemType] with C_COMBINABLE[T_Result]*/
  class Module(val mname : String)

  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]*/

我猜编译错误很明显。您尝试将 M_MAX_LATTICE[Int] 类型的 new M_MAX_LATTICE[T_Integer]... 分配给 t_IntegerMaxLattice 覆盖不同类型的值。

如果你让 class M_MAX_LATTICE extend trait C_TYPE 你的代码似乎可以编译

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] //added
{
  val v_less = t_TO.v_less;
  val v_less_equal = t_TO.v_less_equal;
  val v_assert: T_TO => Unit = ??? //added
  val v_node_equivalent: (T_TO, T_TO) => T_OrLattice = ??? //added
  val v_string: T_TO => String = ??? //added
}

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2018-01-30
    • 2016-12-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多