![](/img/trans.png)
[英]Swapping elements of two distinct arrays in C without using temporary variable
[英]Swapping elements of two Arrays in Scala with wildcard type
我想做以下事情:
class A[T] (_arr: Array[T]) { var arr = _arr }
class C {
def foo[T <: A[_]](a: Array[T]){
var ele1 = a(0)
var ele2 = a(1)
for(i <- 0 until ele1.arr.length) {
val temp = ele1.arr(i)
ele1.arr(i) = ele2.arr(i)
ele2.arr(i) = temp
}
}
}
但是我收到以下编译器错误:
<console>:15: error: type mismatch;
found : temp.type (with underlying type Any)
required: _$1
ele2.arr(i) = temp
^
我不确定为什么ele1.arr(i)= ele2.arr(i)可以工作,而ele2.arr(i)= temp不能工作。
编辑:根据雷克斯的建议,我将其更改为以下内容:
class A[T] (_arr: Array[T]) { var arr = _arr }
class C {
def foo[T, B <: A[T]](b: Array[B]){
var ele1 = b(0)
var ele2 = b(1)
for(i <- 0 until ele1.arr.length) {
val temp = ele1.arr(i)
ele1.arr(i) = ele2.arr(i)
ele2.arr(i) = temp
}
}
}
现在可以编译了。 但是当我做一个测试用例时,如下:
object Test extends App {
var p = Array.ofDim[A[Int]](2)
var g1 = new A[Int](Array(1, 2, 3, 4, 5))
var g2 = new A[Int](Array(6, 7, 8, 9, 10))
p(0) = g1
p(1) = g2
(new C).foo(p)
p.foreach{ x => println(x.arr.deep.mkString(",")) }
}
我收到以下编译器错误:
src/Test.scala:22: error: inferred type arguments [A[Int],Nothing] do not conform to method foo's type parameter bounds [B <: A[T],T]
(new C).foo(p)
^
src/Test.scala:22: error: type mismatch;
found : Array[A[Int]]
required: Array[B]
(new C).foo(p)
^
two errors found
我知道我可以(新C).fooInt,A [Int],但是我真的很想让编译器来推断它。 否则,这会破坏我很多工作的目的。
我不明白为什么您在这里使用通配符而不是参数化元素类型。 您使编译器蒙蔽了视线,并使它变得更难确定您在做明智的事情。 尤其是,它认识到由于数组是不变类型的,因此ele1.arr(i)
和ele2.arr(i)
是同一类型,因此可以分配。 但是当您分配给temp
,它意识到它不知道该类型实际上可能是什么,因此它会推断Any
,然后当然不会适合该数组,因为它实际上不是Any
; 它只是失去了应有的状态。
class C {
def foo[T, B <: A[T]](b: Array[B]){
var ele1 = b(0)
var ele2 = b(1)
for(i <- 0 until ele1.arr.length) {
val temp = ele1.arr(i)
ele1.arr(i) = ele2.arr(i)
ele2.arr(i) = temp
}
}
}
允许编译器完全了解类型,从而使编译器保持快乐并更加安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.