par*_*tic 6 autoboxing scala specialization
我有一个特点和实现看起来像:
trait Foo[A] {
def bar[B >: A: Ordering]: Foo[B]
}
class FooImpl[A]( val a: A, val values: List[Foo[A]] ) extends Foo[A] {
def bar[B >: A] = { /* concrete implementation */}
}
Run Code Online (Sandbox Code Playgroud)
我想使用@specialized注释A并B避免自动装箱.我是否需要在特征和实现中使用它,仅在实现中使用它,或仅在特征中使用它?
REPL 和 javap 一起为我们提供了正确的答案,它将显示反汇编的 java 代码。如果将 tools.jar 添加到 REPL 类路径中,您将能够执行如下很酷的操作:
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();
}
Run Code Online (Sandbox Code Playgroud)
所以现在您应该清楚,仅在特征级别提供 @specialized 就足够了:在 Foo 接口中,您显然有两个方法声明。然而,在我看来,这是一个诡计:
scala> new Hello
res0: Hello = Hello@7a80747
scala> res0.doSomething("test")
<console>:11: error: type mismatch;
found : java.lang.String("test")
required: Int
Run Code Online (Sandbox Code Playgroud)
虽然我可以回答你的问题,但有一些问题我无法回答:
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |