首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala通用数组元素

Scala通用数组元素
EN

Stack Overflow用户
提问于 2017-09-29 23:06:47
回答 3查看 1.5K关注 0票数 0

我正在尝试编写一个函数来计算T类型元素数组中通过T=>Boolean类型测试的元素数。

到目前为止,我得到的是:

代码语言:javascript
复制
     def countPass[T](elem: Array[T]) = {
        var count = 0
        for(x <- elem) 
            x match { 
                case x: T => count += 1
            }
        count
    }

    //TEST
    println(countPass[Boolean](Array(true, 52, "test")))

我有几个错误,第一个是:

代码语言:javascript
复制
combinators.scala:45: warning: abstract type pattern T is unchecked since
it is eliminated by erasure
                        case x: T => count += 1
                                ^

下一个错误是:

代码语言:javascript
复制
combinators.scala:54: error: type mismatch;
 found   : Int(52)
 required: Boolean
    println(countPass[Boolean](Array(true, 52, "test")))
                                           ^
combinators.scala:54: error: type mismatch;
 found   : String("test")
 required: Boolean
    println(countPass[Boolean](Array(true, 52, "test")))
                                               ^

我不确定第一个错误会发生什么,但是对于第二个错误,它会在任何时候抛出异常,而不是布尔值。我不希望这种情况发生,因为我只是在计算数组中T类型元素的数量。

问题:如何重构我的代码以修复这两个错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-29 23:29:47

诀窍是使用ClassTag。完成您的请求的更好方法如下:

代码语言:javascript
复制
import scala.reflect.ClassTag

object Main extends App {

  val array: Array[Any] = Array("string1", "string2", "string3", true, false, 13)

  def countPass[Other: ClassTag](array: Array[Any]): Int = {
    array.collect { case x: Other => x }.length
  }

  println(s"countPass String = ${countPass[String](array)}")
  println(s"countPass Boolean = ${countPass[Boolean](array)}")
  println(s"countPass Int = ${countPass[Int](array)}")
}

您可以阅读来了解有关ClassTagTypeTag的更多信息。

票数 7
EN

Stack Overflow用户

发布于 2017-09-29 23:57:26

所以我找到了一种可行的方法,但不是我想要的。

代码语言:javascript
复制
     def countPass[T](elem: Array[T]) = {
        var count = 0
        for(x <- elem) 
            x match { 
                case _: Boolean => count += 1
                case _ => None
            }
        count
    }

    //TEST
    println(countPass[Any](Array(true, 5, "test", false, false)))

问题是我需要将任何信息传递到数组中,因为其中有不同的类型。此外,我需要稍微修改我的案例,并添加默认的情况。

这个很好,但我更想要这样的东西。由于上面指定的相同错误,这不起作用。

代码语言:javascript
复制
    def countPass[T](elem: Array[Any]) = {
        var count = 0
        for(x <- elem) 
            x match { 
                case _: T => count += 1   //Here is the error
                case _ => None
            }
        count
    }

    //TEST
    println(countPass[Boolean](Array(true, 5, "test", false, false)))

由于某些原因,我不能将_:t作为我的情况,或者我得到了以下错误:

代码语言:javascript
复制
combinators.scala:44: warning: abstract type pattern T is unchecked since 
it is eliminated by erasure
                case _: T => count += 1
票数 0
EN

Stack Overflow用户

发布于 2017-09-30 01:50:37

可以直接使用方法计数。

代码语言:javascript
复制
def countPass[T: ClassTag](elem: Array[Any]): Int = elem.count{
    case _ : T => true
    case _ => false
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46497957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档