正如 Alexey Romanov 在评论中推测的那样,值类在存储在Seq
. 这是javap -c
for的输出def bar = Seq(Id(1))
:
public scala.collection.Seq<Id> bar();
Code:
0: getstatic #25 // Field scala/collection/Seq$.MODULE$:Lscala/collection/Seq$;
3: getstatic #30 // Field scala/Predef$.MODULE$:Lscala/Predef$;
6: iconst_1
7: anewarray #32 // class Id
10: dup
11: iconst_0
12: new #32 // class Id
15: dup
16: iconst_1
17: invokespecial #35 // Method Id."<init>":(I)V
20: aastore
21: invokevirtual #39 // Method scala/Predef$.genericWrapArray:(Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray;
24: invokevirtual #43 // Method scala/collection/Seq$.apply:(Lscala/collection/Seq;)Lscala/collection/GenTraversable;
27: checkcast #45 // class scala/collection/Seq
30: areturn
请注意,返回类型是Seq<Id>
并且Id."<init>"
在第 17 行被调用。鉴于此,没有映射的拆箱是不可能的。
如果该提议被接受,则此拳击的解决方案将是Scala 3 中的不透明类型。不过,我不确定他们是否会解决您的问题。