如何在scala中创建包含整数值的Array [Any]?

时间:2018-04-09 22:09:06

标签: scala

更新: 我误解了一条错误信息,所以这个问题无效。

val inputIds = Array[Any](7, 1, 3)

足以在Scala中创建一个数组[Any]。

===========

我试图创建一个需要传递给采用数组[Any]的方法的数组,但值是数字。

起初我尝试了创建数组的常规方法:

val inputIds = Array(7, 1, 4)

并收到错误:

Type mismatch, expected: Array[Any], actual: Array[Int]

(来自IntelliJ编辑器,我想我还没有检查它是否正确)

然后我尝试直接创建Integer值,例如由:

Integer.getInteger("7")

并将它们传递给Array构造函数,但我仍然遇到同样的错误。

现在我试过了:

val inputIds: Array[Any] = Array[Any](7, 1, 4)

它给了我:

Type mismatch, expected: Array[Any], actual: Array[Array[Int]]

你可以告诉我有点多余,我想要的只是包装类型而不是原语!我猜Scala正在尝试优化数组进行迭代,但我需要的是一个很小的数组,我可以传递给采用混合类型数组的var args。或者也许更好的方法来创建vararg方法?现在它的类型是:

Array[Any]*

======

好的,所以我解决了我的原始问题(尽管在评论中是否仍然存在争议,我是否正确理解了错误的原因)。但是,它没有解决我的问题,具体如下:

我试图转换具有不同类型的数组数组(有些是嵌套的,但最终是Double或Ints)并且无法弄清楚如何让scala类型系统执行它。这是基本的例子:

val integerArray = Array(7, 1, 4)
val nestedIntegerArray = Array(
  Array(6, 10, 60),
  Array(5, 89, 57),
  Array(15, 3, 5)
)
val nestedDoubleArray = Array(
  Array(.13, .9, .8),
  Array(.2, .777, .57),
  Array(.15, .3, .5)
)

val brokenComputation = typeErrorExample(integerArray, nestedIntegerArray, nestedDoubleArray)

调用的方法是:

  private def typeErrorExample(arrays: Array[_ <: Any]*)={
    val arrayDataFrame = Array(arrays).transpose
  }

这给出了错误:

No implicit view available from Seq[Array[_]] => Array[U].
[INFO]     val arrayDataFrame = Array(arrays).transpose

正确的方法是什么?我应该使用非数组数据结构吗?

希望拥有更多代码可以帮助专家了解导致我原始错误的原因。 (inputIds已重命名为integerArray以保持一致性。)

5 个答案:

答案 0 :(得分:1)

@Adair,这似乎将输入数组排列到您正在寻找的Array[Array[Any]]类型中。

def transpose(arrays: Array[_]*) :Array[Array[_]] =
  arrays.indices.map(x => arrays.map(_(x)).toArray).toArray

现在这里有一个建议:不要做

  • 这是不安全的。如果传递的数组数超过每个数组的维数,这将抛出异常。
  • 类型Any不是您想要的。当数据元素变为Any类型时,您就会丢失类型信息,并且试图将其取回是一种巨大的痛苦。

答案 1 :(得分:0)

明确地施放并不理想,但应该这样做。

export class UserRegistrationComponent implements OnInit {
    @Input('group')

    @Output() userFormIsValid = new EventEmitter<boolean>(); 

    first_name:FormControl;

    ngOnInit() {
        this.first_name = new FormControl('', [
            Validators.required,
            Validators.minLength(3),
            Validators.maxLength(30),
            Validators.pattern('^[a-zA-Z ]+$')
        ]);
    }

    onChanges(): void {
        this.userFormIsValid.emit(this.first_name.valid)
    }
}

答案 2 :(得分:0)

Jason的回答是有效的,当我在intelliJ之外运行并更改方法签名中的数据类型时,编译器错误的建议也是如此:

arrays: Array[_ <: Any]*

答案 3 :(得分:0)

scala> Array(1, 2, 3).map(_.asInstanceOf[Any])
res6: Array[Any] = Array(1, 2, 3)

答案 4 :(得分:0)

有许多答案是正确的。但为什么甚至需要做asInstanceOf。你可以轻松完成。

scala> val arr: Array[Any] = Array(1,2,3)
arr: Array[Any] = Array(1, 2, 3)

简单,工作完成。