gpt4 book ai didi

scala - @specialized 在特征中的用法

转载 作者:行者123 更新时间:2023-12-04 15:35:52 24 4
gpt4 key购买 nike

我有一个特征和一个实现,如下所示:

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 */}
}

我想使用 @specialized注释 AB以避免自动装箱。我需要在 trait 和 implementation 中使用它,仅在 implementation 中,还是仅在 trait 中使用它?

最佳答案

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();
}

因此,现在您应该清楚,仅在 trait 级别提供 @specialized 就足够了:在 Foo 接口(interface)中,您显然有两个方法声明。然而,在我看来,那里正在发生一个诡计:
scala>  new Hello
res0: Hello = Hello@7a80747

scala> res0.doSomething("test")
<console>:11: error: type mismatch;
found : java.lang.String("test")
required: Int

虽然我可以回答你的问题,但有些问题我无法回答:
  • 为什么这些方法在特征中被定义为公共(public)抽象?
  • 为什么反汇编的类中有方法doSomething(java.lang.Object),但不能调用?
  • 关于scala - @specialized 在特征中的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194730/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com