更新: 我误解了一条错误信息,所以这个问题无效。
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以保持一致性。)
答案 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)
简单,工作完成。