Учет параметров типа в методе «равно» класса Scala ... является ли это единственным способом? - PullRequest
3 голосов
/ 19 июля 2010

Учитывая простой универсальный класс:

class EqualsQuestion[T]( val value :T )

, кажется разумным, что следующий код разрешит "false":

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

(Да, это надуманный пример. Вмой реальный код, который я хотел, чтобы '==' потерпел неудачу, если параметры типа отличаются, независимо от того, совпадают ли значения, хотя на данный момент я не уверен, что это имеет смысл. Тем не менее, мне показался интересным вопрос Scalaломать голову.)

Во всяком случае, я, конечно, не смог реализовать такой метод 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» является типом, но он понятия не имеет, что это за тип.Таким образом, он не может сравнивать.

Кажется, что 2.8 может решить эту проблему с помощью манифестов, но ... Я не совсем склонен к гроккингу Как мне обойти стирание типов в Scala?Или, почему я не могу получить параметр типа моих коллекций? .

Есть ли другие способы обойти это?

1 Ответ

4 голосов
/ 19 июля 2010

Кажется, что следующая функция может различать 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]. Я надеюсь, что это достаточно хорошо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...