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

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

生成されたクラスKeyed$mcI$spに特化されていないeqOnKey方法としてspecializable形質にScalaの方法を専門とすることはできません。は、戻り値の型

このメソッドを特殊化するにはどうすればよいですか?Keyed$mcI$spのメソッドeqOnKey$mcI$spの戻り型をEq$mcI$spとするにはどうすればよいですか?

答えて

2

あなたが式を持つキー付き延長する場合は、専門の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 
ために、次のバイトコードを生成します。