Arrays 如何在Scala中使用默认值初始化泛型数组

Arrays 如何在Scala中使用默认值初始化泛型数组,arrays,scala,generics,Arrays,Scala,Generics,我在尝试用泛型类型初始化数组并将其存储在值(val)中时遇到问题 case-class矩阵[TT:Numeric 如果我是你,我会将T限制为Numeric类型,然后使用zero值作为空矩阵的默认值: scala> :pa // Entering paste mode (ctrl-D to finish) import scala.reflect.ClassTag class Matrix[T:Numeric](val structure: Array[Array[T]]) {

我在尝试用泛型类型初始化数组并将其存储在值(val)中时遇到问题

case-class矩阵[T
T:Numeric
如果我是你,我会将
T
限制为
Numeric
类型,然后使用
zero
值作为空矩阵的默认值:

scala> :pa
// Entering paste mode (ctrl-D to finish)

import scala.reflect.ClassTag

class Matrix[T:Numeric](val structure: Array[Array[T]])
{
    def *(that: Matrix[T]): Matrix[T] = ???
    def +(that: Matrix[T]): Matrix[T] = ???
    override def toString: String = structure.map(_.mkString(",")).mkString("\n")
}

object Matrix
{
    def apply[T:Numeric:ClassTag](rows: Int, cols: Int): Matrix[T] =
    {
        val zero: T = implicitly[Numeric[T]].zero
        new Matrix[T](Array.fill[T](rows, cols)(zero))
    }

    def apply[T:Numeric](data: Array[Array[T]]): Matrix[T] = new Matrix(data)
}

// Exiting paste mode, now interpreting.

import scala.reflect.ClassTag
defined class Matrix
defined object Matrix

scala> val empty = Matrix[Int](3,3)
empty: Matrix[Int] =
0,0,0
0,0,0
0,0,0

scala> val ex = Matrix[Int](Array(Array(1,2), Array(3,4)))
ex: Matrix[Int] =
1,2
3,4
T:pa
//进入粘贴模式(按ctrl-D键完成)
导入scala.reflect.ClassTag
类矩阵[T>:Null:Null:Null案例类人物(名称:字符串)
限定类人
scala>val empty=矩阵[人](3,3)
空:矩阵[人]=
空,空,空
空,空,空
空,空,空
scala>val数据=数组(数组(人(“a”)、人(“b”)、数组(人(“c”)、人(“d”))
数据:Array[Array[Person]=Array(Array(Person(a)、Person(b))、Array(Person(c)、Person(d)))
scala>val ex=矩阵[人](数据)
例如:矩阵[人]=
个人(a),个人(b)
人员(c)、人员(d)

注意,您必须通过添加绑定的
T>:Null来手动指定
T
可以是
Null
的超类型。如果需要默认值,只需使用
Array.ofDim(this.structure.length,this.structure.head.length,this.structure.head.length)
而不是
Array.fill
。在Java中,对象的值将是
null
Int
的值将是
0
Double
的值将是
0.0
,等等。它也更便宜


您需要在作用域中使用
ClassTag[T]
,但在
fill
中也需要它。

AnyVal
s不能
null
。您是对的。我刚刚注意到了它。但是,对于AnyVal,哪一个等同于null?您正在查找
AnyRef
。仍然抛出类型不匹配:find null(null),必填项:T如果您谈论的是
val aux
,那么也许您应该声明您的
T
。感觉您在这里丢失了太多的代码,我们无法帮助您。问题是,我想使用矩阵来包含其他数据类型,而不仅仅是数值。这就是为什么我想用defaul来初始化数组t值,并将其指定为一个变量(或本例中的值),这很合理,但总体思路仍然认为默认值需要为
t
类型(因此,如果您可以将
t
限制为数据的某个紧超类型,然后使用该超类型的值,那么这将是理想的选择)例如,在Java中,所有类都有类似于上一个父类的对象。因此,创建数组时对象的默认值为null。在Scala中,哪个是默认值?应该有类似的值。我知道Scala“不喜欢”null,这就是他们使用选项的原因,但是我认为应该有一个像null这样的默认值,但是对于Scala。你需要说它可以是
null
显式使用
T>:null@Malvrok这能回答你的问题吗?
scala> :pa
// Entering paste mode (ctrl-D to finish)

import scala.reflect.ClassTag

class Matrix[T:Numeric](val structure: Array[Array[T]])
{
    def *(that: Matrix[T]): Matrix[T] = ???
    def +(that: Matrix[T]): Matrix[T] = ???
    override def toString: String = structure.map(_.mkString(",")).mkString("\n")
}

object Matrix
{
    def apply[T:Numeric:ClassTag](rows: Int, cols: Int): Matrix[T] =
    {
        val zero: T = implicitly[Numeric[T]].zero
        new Matrix[T](Array.fill[T](rows, cols)(zero))
    }

    def apply[T:Numeric](data: Array[Array[T]]): Matrix[T] = new Matrix(data)
}

// Exiting paste mode, now interpreting.

import scala.reflect.ClassTag
defined class Matrix
defined object Matrix

scala> val empty = Matrix[Int](3,3)
empty: Matrix[Int] =
0,0,0
0,0,0
0,0,0

scala> val ex = Matrix[Int](Array(Array(1,2), Array(3,4)))
ex: Matrix[Int] =
1,2
3,4
scala> :pa
// Entering paste mode (ctrl-D to finish)

import scala.reflect.ClassTag

class Matrix[T >: Null <: AnyRef](val structure : Array[Array[T]])
{
    override def toString: String = structure.map(_.mkString(",")).mkString("\n")
}

object Matrix
{
    def apply[T >: Null <: AnyRef : ClassTag](rows: Int, cols: Int): Matrix[T] =
    {
        new Matrix[T](Array.fill[T](rows, cols)(null))
    }

    def apply[T >: Null <: AnyRef](data: Array[Array[T]]): Matrix[T] = new Matrix(data)
}

// Exiting paste mode, now interpreting.

import scala.reflect.ClassTag
defined class Matrix
defined object Matrix

scala> case class Person(name: String)
defined class Person

scala> val empty = Matrix[Person](3,3)
empty: Matrix[Person] =
null,null,null
null,null,null
null,null,null

scala> val data = Array(Array(Person("a"), Person("b")), Array(Person("c"), Person("d")))
data: Array[Array[Person]] = Array(Array(Person(a), Person(b)), Array(Person(c), Person(d)))

scala> val ex = Matrix[Person](data)
ex: Matrix[Person] =
Person(a),Person(b)
Person(c),Person(d)