Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型数据类型上的Scala方法_Scala_Generics_Type Conversion_Implicit - Fatal编程技术网

泛型数据类型上的Scala方法

泛型数据类型上的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

我试图创建一个只接受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.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