代码之家  ›  专栏  ›  技术社区  ›  Rodney Gitzel

在Scala泛型类“equals”方法中说明类型参数…清单是唯一的方法吗?

  •  3
  • Rodney Gitzel  · 技术社区  · 14 年前

    class EqualsQuestion[T]( val value :T )
    

    以下代码将解析为“false”似乎是合理的:

    val a = new EqualsQuestion[Int]( 5 )
    val b = new EqualsQuestion[Long]( 5 )
    a == b
    

    (是的,这是一个人为的例子。在我的实际代码中,如果类型参数不同,我希望“==”失败,不管值是否相同,尽管目前我不确定这是否有意义。尽管如此,我还是觉得这是一个有趣的问题。)

    无论如何,我当然还没能实现这样一个equals()方法:

    override def equals( obj :Any ) :Boolean = 
    {
        obj match {
            case that :EqualsQuestion[T] => 
                    ( this.getClass == that.getClass ) &&  // no help
                    this.getClass().isInstance(that) && // no help
                    //this.value.getClass == that.value.getClass && // doesn't even compile
                    this.value == that.value
    
            case _ => false
        }
    }
    

    问题是类型擦除,我知道:目前编译器只知道“T”是一个类型,但它不知道该类型是什么。所以不能进行比较。

    How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections? .

    1 回复  |  直到 7 年前
        1
  •  4
  •   Landei    14 年前

    以下函数似乎能够区分a和b:

    def same(x: EqualsQuestion[_], y: EqualsQuestion[_]) = {
      x.value.asInstanceOf[AnyRef].getClass == y.value.asInstanceOf[AnyRef].getClass && 
      x.value == y.value
    }
    

    请注意,只有当T本身不是泛型类型时,这才有效,例如,它不会区分List[Int]和List[Long]。我希望这足够好。。。