簡體   English   中英

關於Scala泛型:找不到元素類型T的類清單

[英]About Scala generics: cannot find class manifest for element type T

對於以下功能:

def reverse[T](a: Array[T]): Array[T] = {
    val b = new Array[T](a.length)
    for (i <- 0 until a.length)
        b(i) = a(a.length -i - 1)
    b
}

我從第2行得到“錯誤:無法找到元素類型T的類清單”。

反正有沒有解決這個問題?

只需在方法聲明中添加一個上下文綁定的ClassManifest

def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...

為了構造數組,必須在編譯時知道數組的具體類型。 此類型由編譯器通過隱式ClassManifest參數提供。 也就是說,Array構造函數的簽名實際上是

Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T]

為了提供此參數,在調用Array構造函數時,范圍內必須有ClassManifest。 因此,您的反向方法還必須采用隱式ClassManifest參數:

def reverse[T](a: Array[T])(implicit m: ClassManifest[T]): Array[T] = ...
// or equivalently
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...

后者,更簡單的表示法稱為上下文綁定

使用[T:ClassManifest]時如果顯示為已棄用[T:ClassTag]

在聲明Generic Type參數時,以下方式有效:

  • (T:ClassManifest),但在scala 2.11中顯示已棄用。
  • (T:清單)
  • (T:ClassTag),無誤地工作,看起來像一個完美的解決方案,因為編譯器給出的錯誤是:

    找不到元素類型T的類標記

package com.github.sandip.adt

import scala.reflect.ClassTag

class QueueUsingArray[T](capacity: Int) {
  var array = new Array[T](capacity)

  private var front = -1
  private var rare = -1

  def enqueue(data: T) = {
    array(rare + 1) = data
    rare += 1
  }

  def dequeue: T = {
    front += 1
    array(front)
  }

  def isEmpty() = {
    !nonEmpty
  }

  def nonEmpty: Boolean = {
    rare > front
  }

}

object Main {
  def main(args: Array[String]): Unit = {
    val queue = new QueueUsingArray[Int](10)
    queue.enqueue(10)
    queue.enqueue(20)
    while (queue.nonEmpty) {
      println(queue.dequeue)
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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