- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我正在编写一个扩展方法
implicit class EnhancedFoo(foo: Foo) {
def bar() { /* ... */ }
}
您是否应该始终在类定义中包含extends AnyVal
?在什么情况下您不想将隐式类设为值类?
最佳答案
让我们看看 limitations listed for value classes并思考它们何时可能不适合隐式类:
“必须只有一个主构造函数,并且具有一个公共(public) val 参数,其类型不是值类。”因此,如果您要包装的类本身就是一个值类,则您不能使用隐式类
作为包装器,但您可以这样做:
// wrapped class
class Meters(val value: Int) extends AnyVal { ... }
// wrapper
class RichMeters(val value: Int) extends AnyVal { ... }
object RichMeters {
implicit def wrap(m: Meter) = new RichMeter(m.value)
}
如果您的包装器也有隐式参数,您可以尝试将它们移至方法声明中。 IE。而不是
implicit class RichFoo[T](foo: Foo[T])(implicit ord: Ordering[T]) {
def bar(otherFoo: Foo[T]) = // something using ord
}
你有
implicit class RichFoo[T](foo: Foo[T]) extends AnyVal {
def bar(otherFoo: Foo[T])(implicit ord: Ordering[T]) = // something using ord
}
“可能没有专门的类型参数。”在包装本身具有专门类型参数的类时,您可能希望包装器是专门的。
equals
或 hashCode
方法。”无关紧要,因为隐式类也不应该具有 equals/hashCode
。var
或 lazy val
的合理用例。此外,使隐式类成为值类可能会更改使用反射的代码的某些行为,但反射通常不应看到隐式类。
如果您的隐式类确实满足所有这些限制,我想不出不将其设为值类的理由。
关于scala - 隐式类应该总是扩展 AnyVal 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929422/
假设我有一个值(value)案例类 case class Id(i:Int) extends AnyVal 以及包含此值案例类的序列 Seq(Id(1), Id(2), Id(3)) 有没有办法将这些
据我了解,Scala 中的值类只是将原始类型(如 Int 或 Boolean)包装成另一种类型,而不会引入额外的内存使用。所以它们基本上被用作普通类的轻量级替代品。 这让我想起了 Haskell 的
我正在寻找一个接受函数的方法的正确签名 功能 和一个论点 arg ,通过网络将它们复制到远程计算机并返回结果。目前签名是这样的: def invokeRemote[A,B](address: Stri
我想不出任何情况下类型 AnyVal会很有用,尤其是添加了 Numeric用于抽象的类型 Int , Long等。AnyVal 是否有任何实际用例? ,或者它只是一个使类型层次结构更漂亮的工件? 澄清
为了引入更多类型安全性,我们可以使用 shapeless 提供的标记类型或创建一个扩展 AnyVal 的类。使用其中一种与另一种相比有什么区别和优点/缺点? 示例: trait CountryCode
我不小心写了这行代码: scala> val f = Int f: Int.type = object scala.Int 似乎适用于 AnyVal 的每个子类型除了 AnyVal本身。 有什么我可以
试过这个: scala> 2.isInstanceOf[AnyVal] :8: error: type AnyVal cannot be used in a type pattern or isIns
假设我有一个自定义类,它扩展了 AnyVal 并在内部使用了一个 Long: case class Instruction(underlying: Long) extends AnyVal 当我将 I
假设我正在编写一个扩展方法 implicit class EnhancedFoo(foo: Foo) { def bar() { /* ... */ } } 您是否应该始终在类定义中包含exten
我一直在用scala编写代码来查找最短路径。这是我寻找最短路径的代码。但我在以下代码部分遇到错误 if ( (kv1._1 + kv1._2 ) val a = line.split(",")
这是我的代码。我在第二个 case 子句中遇到编译错误: Error:(92, 26) value "price under 2" def tupleMatch: Unit = { val do
为什么Scala Some不继承AnyVal,使用值类型特性,节省装箱成本? 就像是: sealed trait TestOption[+A] extends Any { def isEmpty:
在 Java 中,当我们在方法中创建原语时,它们存储在堆栈内存中,而实例化的对象(如使用 new)则放在堆中。在 scala 中,AnyVal 的子类型(如 Int)是无法实例化的不可变值实例。因此,
任何人都可以解释为什么下面的 Scala 代码片段: def convertRefToVal(obj: Any): Int = { if (obj.isInstanceOf[java.lang.I
是斯卡拉 AnyVal及其子类 [可以] 堆栈分配 [如 C# 结构或 Java 原语]?我们可以像 Scala 上的 C# 结构一样创建一个自定义的堆栈分配变量吗? 最佳答案 斯卡拉: class
因此,在 Java 中,我们看到基本类型比对象类型占用更少的内存空间。例如,int 比 Integer 实例占用的空间更少。因此,使用 char 而不是 String 来存储单个字符通常更明智。 我想
我想知道,为什么 AnyVal 不能在 isInstanceOf 检查中使用?这种行为背后的原因是什么? scala> val c = 't' c: Char = t scala> c.isInsta
我想派生值类的编码器实例。使用 semiauto 机制,我无法派生嵌套类。 想象一下下面的案例类结构 { case class Recipient(email: Recipient.Email,
我有一个这样定义的映射器函数: def foo(x:Int) = if (x>2) x*2 此方法的类型签名是 Int => AnyVal。现在,如果我将此函数映射到整数列表: scala> List
尝试在 Scala 中使用 json4s 序列化 AnyVal 序列时遇到问题。 这是使用 FunSuite 进行的测试,可重现该问题: import org.json4s._ import
我是一名优秀的程序员,十分优秀!