Невозможно специализировать метод Scala со специальным признаком как возвращаемый тип

trait Eq[@specialized -X] {
  def eq(x: X, y: X): Boolean
}

trait Keyed[@specialized(Int) X] {
  def eqOnKey: Eq[X]
}

Метод eqOnKey не специализируется на сгенерированном классе Keyed$mcI$sp.

Как я могу специализировать этот метод, т.е. сделать возвращаемый тип метода eqOnKey$mcI$sp в классе Keyed$mcI$sp равным Eq$mcI$sp?

Ответ 1

Если вы расширите Keyed with Eq, вы получите специализированный метод eq. Это может не сработать для вас, в зависимости от вашего варианта использования.

trait Eq[@specialized -X] {
  def eq(x: X, y: X): Boolean
}

trait Keyed[@specialized(Int) X] extends Eq[X]


class Foo extends Keyed[Int] {
  def eq(x: Int, y: Int) : Boolean = x == y
}

Сгенерирует следующий байт-код для Foo

  public boolean eq$mcI$sp(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: if_icmpne     9
       5: iconst_1
       6: goto          10
       9: iconst_0
      10: ireturn

  public boolean eq(java.lang.Object, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: invokestatic  #146                // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
       5: aload_2
       6: invokestatic  #146                // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
       9: invokevirtual #148                // Method eq:(II)Z
      12: ireturn