2016-02-02 3 views
10
trait Eq[@specialized -X] { 
    def eq(x: X, y: X): Boolean 
} 

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

eqOnKey Метода не специализировался в созданном классе Keyed$mcI$sp.Не может специализироваться методом Scala с specializable признака в качестве возвращаемого типа

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

ответ

2

Если вы расширяете Keyed с помощью 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