泛型数据类型上的Scala方法
我试图创建一个只接受java.math.BigDecimal或Long的泛型类。代码如下:泛型数据类型上的Scala方法,scala,generics,type-conversion,implicit,Scala,Generics,Type Conversion,Implicit,我试图创建一个只接受java.math.BigDecimal或Long的泛型类。代码如下: class myClass[T]() { def display( x : T) = { println(x.doubleValue()) } } val input = new java.math.BigDecimal(100) // val input = 100L val x = new myClass[java.math.BigDecimal]() x.disp
class myClass[T]()
{
def display( x : T) = {
println(x.doubleValue())
}
}
val input = new java.math.BigDecimal(100)
// val input = 100L
val x = new myClass[java.math.BigDecimal]()
x.display(input)
很明显,我将遇到以下错误:ScalaFiddle.scala:22:error:value doubleValue不是类型参数T的成员
我尝试了几个小时的隐式转换、视图绑定和上下文绑定。到目前为止没有结果。有没有办法让Scala相信T有method.doubleValue?java.big.Decimal和Long都有.doubleValue方法,但它们不共享同一个超类
class myClass[T <: {def doubleValue(): Double}]
在Dotty Scala 3中,我们可以使用 或使用类型参数
scala> class C[A <: Number] private (n: A) { def d = n.doubleValue ; def a = n } ; object C {
| def apply(i: Long) = new C(i: Number) ; def apply(b: BigDecimal) = new C(b) }
defined class C
defined object C
数字具有双重值。然后只暴露需要长时间和大数据的构造函数,不管怎样。嗨,Dmytro,谢谢你的回答。对于第一个解决方案,如果传入Long,我将遇到以下错误-错误:类型参数[scala.this.Long]不符合类myClass的类型参数界限[T@bbbbz Try val input1=100L val x1=new myClass[java.lang.Long]x1.DisplayInput1感谢解决方案!似乎只有当我显式地将定义了数据类型的变量传递给新的C.d时,它才起作用。在我的例子中,如果我将x.doubleValue替换为Cx.d,Scala将显示以下错误:错误:重载方法构造函数C和替代项:b:BigDecimalScalaFIDLE.this.C I:Scala.this.LongScalFIDLE.this.C不能应用于T
class myClass[T <: (Long | java.math.BigDecimal)]() {
def display(x: T) =
println(
x match {
case t: Long => t.doubleValue
case t: java.math.BigDecimal => t.doubleValue
}
)
}
new myClass().display(new java.math.BigDecimal(100)) // OK
new myClass().display(100L) // OK
new myClass().display("100") // Error
scala> class C private (n: Number) {
| def this(i: Long) = this(i: Number)
| def this(b: BigDecimal) = this(b: Number)
| def d = n.doubleValue
| }
defined class C
scala> new C(42L).d
res0: Double = 42.0
scala> new C(BigDecimal("123456789")).d
res1: Double = 1.23456789E8
scala> class C[A <: Number] private (n: A) { def d = n.doubleValue ; def a = n } ; object C {
| def apply(i: Long) = new C(i: Number) ; def apply(b: BigDecimal) = new C(b) }
defined class C
defined object C