Учитывая простой универсальный класс:
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?Или, почему я не могу получить параметр типа моих коллекций? .
Есть ли другие способы обойти это?