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] 
} 

Verfahren spezialisiert eqOnKey nicht Keyed$mcI$sp in der generierten Klasse spezialisiert.kann keine Scala Methode mit specializable Eigenschaft als Rückgabetyp

Wie kann ich diese Methode spezialisieren, also den Rückgabetyp der Methode eqOnKey$mcI$sp in Klasse Keyed$mcI$sp zu Eq$mcI$sp machen?

Antwort

2

Wenn Sie Keyed mit Eq erweitern, erhalten Sie eine spezielle eq-Methode. Dies funktioniert möglicherweise nicht für Sie, abhängig von Ihrem Anwendungsfall.

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 
} 

Wird der folgende Bytecode für 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 
erzeugen
Verwandte Themen