簡體   English   中英

在Scala中使用通配符類型交換兩個數組的元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM