问题标签 [value-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
104 浏览

scala - 是否有可能在scala中获得专门值类的效果?

我知道@specialized类和值类是如何工作的,并且我知道我不能有一个专门的值类,例如:

我找不到获得类似效果的方法:使用单个声明创建一个用户类型/类型构造函数,它可以作为几个 java 原语的纯句法包装器 - 是否可以解决这个限制?

值类背后的主要动机之一是用业务意义“注释”值类型并创建与其数据类型不同的类型:

只要您静态地知道盒装类型,这就会非常有效,但是如果您想将几个不同的基元视为毫伏,您可以选择为每个基元创建一个新的包装器,或者对它们的设计使用泛型至:

这一切都很甜蜜,并且确实of在编译时删除了包装器,但不幸的是,原语被装箱到它们的 java 包装器中,并且这两个字段被编译为:

而不是longint领域。

是否可以编写以下代码:

  • 允许使用单个声明创建新的此类包装器(新的“单元”类型);
  • 至少在底层原语方面对此类包装器执行通用操作(以毫伏为单位的方法,从盒装原语中抽象出来);
  • 当包装器类型和底层原始类型都被完全实例化(不是泛型类型的类型参数)并且可以内联调用的方法时不执行装箱(所以我可以为所有当前和未来的单元定义一次添加)
  • 理想情况下不依赖于客户端代码中的宏(实现中的使用很好,只要类型声明本身可以被 IDE 理解)
0 投票
0 回答
97 浏览

scala - 为什么 scala 不对值类进行内联工厂方法?

考虑:

用(2.11.7)编译scalac -feature -Xprint:all Playground.scala我看到了

事实上,javap -v -private Playground显示:

将 Playground 构造函数更改为:

两者都按预期显示文字1的分配。w坦率地说,我对这个发现感到非常失望,因为它实际上阻止了使用值类的类型级编程(其中一个短暂的值类实例是由一系列琐碎的内联方法创建的。

0 投票
1 回答
53 浏览

java - Java:枚举和值类之间有什么区别(也在使用中)?

我看不出值类和枚举之间的区别。如果有人能告诉我它们之间的区别以及它们的用途有什么区别,那就太好了。

0 投票
2 回答
786 浏览

scala - scala值类多重继承

我的项目中有代表 ID 的对象。

假设它是ChairId、TableId、LampId。我希望它们都继承自 GenericId。我希望能够打电话def f(x: GenericId) = x.id

我希望他们只持有单身id: String,所以我想让他们扩展 AnyVal。

此外,我希望每种类型都提供generate会生成我的特定 ID 的功能,即我想输入类似ChairId.generate()

我输入了这个:

而且我虽然如果 GenericId 会从 AnyVal 继承,那将起作用,但到目前为止还没有运气;/我还尝试使 GenericId 成为一个特征,并使案例类使用 GenericId 扩展 AnyVal,但也不会编译:/

另一件事是TableId.generate()我可以只提供带有功能的伴生对象generate,这基本上解决了我的问题,但我想知道是否有可能在不定义伴生对象的情况下解决这个问题?(即通过某种方式隐含)

// 编辑

关于提供无法编译的代码的评论(我想):

0 投票
2 回答
1838 浏览

scala - scala 类型参数作为对象类型

我怎样才能做到这一点:

我不想为这种情况定义伴随对象,我想知道是否有机会使用隐式扩展对象?

当我这样做时(我使用 TO 作为 TypeObject 和 TC 作为 TypeClass 命名)idFn[TO, TC]我希望 TO 成为实现的对象,def apply(id: String): TC我可以强制执行吗?我将如何使用此功能?在类型参数上调用函数感觉完全不可能:/

0 投票
3 回答
3263 浏览

scala - Scala 值类,用例

我知道value class在编译时在 scala 中内联操作。

也许像这样

但这对我来说似乎没什么大不了的。

它可能会提高性能,但是,

呼叫this.i + that.i似乎并不比i + i

为什么我们需要value classscala 和任何用例???

0 投票
2 回答
487 浏览

scala - 为什么 scala value class#toString 包含案例类信息?

值类可用于实现类型安全,而无需拆箱的开销。

我的印象是,在运行时这样的类型/类将“不存在”,被视为简单类型(例如,值类在运行时case class X(i: Int) extends AnyVal将是简单的)。Int

.toString但是,如果您确实在值类实例上调用方法,它会打印如下内容:

所以我猜编译器毕竟包含一些信息?

0 投票
1 回答
101 浏览

scala - Scala中值类的层次结构?

我已经定义了以下类层次结构,我想将类型参数限制为符合Double...

...是否可以重写上述层次结构,以便具体类型是值类?从文档中我知道值类无法扩展,因此排除了Quantity继承自AnyVal. 为了从具体类继承,AnyVal我需要创建Quantity一个特征,这很好,但是我丢失了类型参数上的逆变注释。

想法?

0 投票
0 回答
40 浏览

scala - 在 Java 中使用 Scala 的值类

我在 Scala 中使用值类来避免在运行时装箱。

例如。:

但是,我使用的是 Java 代码中的相同值类:

这不起作用,因为ThingId实际上编译为 Long:

是否有使用 Java 中的值类(或任何有用的包装器/帮助器)的模式?

0 投票
1 回答
122 浏览

scala - 为什么隐式值类有额外的方法调用?

我正在检查隐式类生成的字节码,并想与它们扩展时生成的字节码进行比较AnyVal

没有隐式:

字节码的(相关部分):

implicit

字节码的(相关部分):

作为扩展AnyVal调用的结果add是在伴随对象上调用,并且在两个版本中,类型Wrapper都没有显示在foo( ) 的类型签名中。public int foo(int);

然而,在第二个版本中,在 return: 之前有一个调用10: invokevirtual #29。它调用public int Wrapper(int);which 似乎没有做任何事情。(虽然我可能错了,因为我没有太多阅读字节码的经验)

所以问题是,这个电话的意义是什么?不能省略吗?