2012-04-17 20 views
6

私は、形質とのように見えるの実装を持っています。私はそれを形質とインプリメンテーションの両方で、インプリメンテーションでのみ、あるいは形質でのみ使う必要がありますか?使い方は

+0

特殊化されていない 'List'を使っていると、どのように特殊化が働くと思いますか?あなたはボクシングを避けることはできません。 –

+0

申し訳ありませんが、投稿のためのコードを簡略化しています。クラスにはAのインスタンスが含まれています(オートボックスにしたくない場合、 'List [Foo [A]]')。 – paradigmatic

+0

しかし、 'Ordering'も特殊化されていません –

答えて

3

REPLには、逆アセンブルされたJavaコードが表示されるjavapと一緒に私たちにとって正しい答えがあります。提供する唯一の特色レベルで@specialized十分であることをあなたに明らかなはずであるだから今

scala> trait Foo[@specialized(Int) A] { def doSomething(a:A)} 
defined trait Foo 

scala> :javap -p Foo 
Compiled from "<console>" 
public interface Foo{ 
    public abstract void doSomething(java.lang.Object); 
    public abstract void doSomething$mcI$sp(int); 
} 

scala> class Hello extends Foo[Int] { def doSomething(a:Int)=println(a)} 
defined class Hello 

scala> :javap -p Hello 
Compiled from "<console>" 
public class Hello extends java.lang.Object implements Foo$mcI$sp,scala.ScalaObject{ 
    public void doSomething(int); 
    public void doSomething$mcI$sp(int); 
    public void doSomething(java.lang.Object); 
    public Hello(); 
} 

:あなたのREPLのクラスパスにtools.jarをを追加する場合は、次のようなクールなものを行うことができるようになります: Fooインターフェースでは、明らかに2つのメソッド宣言があります。

  • をメソッドが定義されている理由:

    scala> new Hello 
    res0: Hello = [email protected] 
    
    scala> res0.doSomething("test") 
    <console>:11: error: type mismatch; 
    found : java.lang.String("test") 
    required: Int 
    

    私はあなたの質問に答えることができますが、私は答えることができないいくつかの質問があります:それはトリックがしかし、そこに起こっているように私には見えますその特性の一般的な要約として?

  • doSomething(java.lang.Object)メソッドは逆アセンブルされたクラスにありますが、呼び出すことができないのはなぜですか?
+0

ありがとう、私は決してREPLで ':javap'を動作させることはできませんでした。 – paradigmatic

+0

コマンドラインからREPLを使用していますか? IDEA?sbt? – Edmondo1984