【问题标题】:not enough arguments for method toArray方法 toArray 的参数不足
【发布时间】:2016-06-09 07:57:10
【问题描述】:

以下代码中的 toArray 调用无法编译

trait A[T] {
  def create:T
  def foo(a:Array[Int]) = {
    for(b <- a) yield create
  }.toArray
}

它会抛出以下错误:

not enough arguments for method toArray: (implicit evidence$1: scala.reflect.ClassTag[T])Array[T]. Unspecified value parameter evidence$1.  
No ClassTag available for T 

我该如何解决?

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    正如 Sergey 所说,Java 数组需要知道 T 的类型,但 T 被类型擦除消除了。

    在 Scala 中,您可以使用 ClassTag 在运行时“保留”类型信息。

    这里有更多关于数组的in-depth discussion

    根据修复它,您需要为T 提供ClassTag 的证据。这是一个可能的解决方案:

    import scala.reflect.ClassTag
    
    trait A[T] {
      def create: T
      def foo(a: Array[Int])(implicit ev: ClassTag[T]) = {
        for(b <- a) yield create
      }.toArray
    }
    

    隐含的ev参数由编译器自动填充。

    【讨论】:

      【解决方案2】:

      问题是您无法在不知道T 的情况下创建Array[T]ClassTag 是 Scala 表示此信息的方式。简单的解决方法是将trait A[T] 更改为abstract class A[T: ClassTag](需要类,因为特征不能有任何构造函数参数,包括隐式参数)。如果您随后使用 specific 类型创建它,例如class B extends A[Int],编译器将插入正确的ClassTag 本身,你需要通过ClassTag 传递一个泛型:class C[T: ClassTag] extends A[T]

      【讨论】:

        【解决方案3】:

        最简单的方法是删除toArray 调用。因为你遍历数组所以你的结果也将是数组。

        【讨论】:

        • 在哪里添加 ClassTag?
        • 结果是 ArraySeq 类型。我想要数组
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 2013-03-20
        • 2014-01-18
        • 1970-01-01
        • 2021-08-12
        相关资源
        最近更新 更多