当前位置: 首页 > 知识库问答 >
问题:

Scala Set[_] vs Set[Any]

淳于健
2023-03-14

我有下面一行代码:

case set: Set[Any] => setFormat[Any].write(set)

但是,编译器会发出警告:

scala.collection中任何类型模式的非变量类型参数。Set[Any]未选中,因为它通过擦除[warn]消除

很公平。

所以我把我的台词改成这样:

case set: Set[_] => setFormat[Any].write(set)

现在我得到一个错误:

找到[错误]:scala.collection.Set[_]

[错误] 必需:scala.collection.Set[Any]

这两者有什么区别?

然后我将代码更改为以下内容:

case set: Set[_] => setFormat[Any].write(set.map(s => s))

现在它很高兴没有错误或警告。

Q2。为什么这个工作??

共有1个答案

辛建业
2023-03-14

Q1:A<code>集合[Any]是元素类型为Any的集合。集合[_]是元素类型未知的集合。可能是一个<code>集合[Int],可能是<code>集[String],也可能是<code>集合[Any]。与大多数(不可变)集合相反,集合不是协变的(声明是<code>特征集[A],而不是<code>特性集[A])。因此,一个<code>集合[String]

Q2:它之所以有效,是因为不管集合中的元素的(未知)类型是什么,恒等函数s =

备注:没有setFormat和write的定义很难确定,但是您真的需要在< code>setFormat[Any]中明确使用< code>[Any]类型参数吗?人们可以将一个存在函数传递给一个一般函数,即

val x: X[_] = ....
def f[A](xa: X[A]) = ...
f(x) // allowed

但是在调用站点(例如 f[Any](x))上显式是不允许的,因为我们不知道 X 是否是 X[Any]

注意:关于集合不是协变的:这是不幸的,因为人们非常觉得一组猫也是一组动物。这是其中一个原因(可能还有其他原因)。

set有一个方法def包含(a: A):Boolean并且此签名可以防止协方差。其他集合有一个def包含[A1

这是可行的,因为实现是基于方法< code>equals,随处可用(JVM自带的),并接受类型为< code>Any的参数。使用与列表内容无关的类型的值进行调用很可能是一个错误,更受约束的签名可能会更好,但这对于协方差来说是一个很小的代价。

但是< code >的这个宽松的签名包含约束,即实现要基于< code>equals(也可能是< code>hashCode)。它不适用于基于排序的实现,因为它不接受无类型的参数。禁止这种(非常常见的)set实现可能会被视为协方差的过高代价。

 类似资料:
  • 问题内容: 我有一个接口,该方法需要一个数组: 我正在使用Mockito嘲笑此接口,我想断言该接口已被调用,但是我不想验证传递了什么参数-“无关”。 如何使用通用方法代替编写以下代码? 问题答案: 从Java 8开始,您可以使用无参数方法,并且类型参数将由编译器推断: 说明 Java 8中的新事物是表达式的 目标类型 将用于推断其子表达式的类型参数。在Java 8之前,仅在大多数情况下用于类型参数

  • 问题内容: 我不确定以下代码是否可以确保Comparator Javadoc中给出的所有条件。 即使该类未实现Comparable,以上代码是否会对所有类的所有实例强加全部顺序? 问题答案: 嘿,看看我发现了什么! http://gafter.blogspot.com/2007/03/compact-object-comparator.html 哦,是的,我忘记了IdentityHashMap(仅

  • 问题内容: 如何将java.util.Map [String,Object]转换为scala.collection.immutable.Map [String,Any],以便将原始映射中的所有值(整数,布尔值等)都转换为正确的值,以在Scala中运作良好。 问题答案: 正如VonC所说,仅支持可变集合,但您不必使用单独的库。派生可变集合,从该集合定义了一个返回不可变Map的方法: 这将输出

  • 问题内容: 我有一个定义以下类型的架构: 这样就创建了一个对象,如下所示: 现在,我尝试将另一个生成的JAXB对象添加到该有效负载中,如下所示: 但是我遇到了一个可怕的异常,看起来它将永远无法工作,所以我决定先将有效负载对象序列化为XML,然后将其作为字符串添加到有效负载中。 而且这会爆炸,并说“ java.lang.String”不包含@XmlRootElement。 那么xs:any的使用将如

  • 问题内容: 如果找到元素,则anyMatch操作将返回true;如果找到匹配的元素,则noneMatch操作将返回false。 如果找不到匹配的元素,则anyMatch操作将返回false-如果找不到匹配的元素,则noneMatch操作将返回true。 因此,除了执行这两项操作外,我们还不能仅执行一项操作,否则我会丢失某些东西吗?从本质上讲,anyMatch返回false是评估noneMatch谓

  • 问题内容: 如果DBMS没有ANY()聚合函数,我通常使用MAX()或MIN()。 在MySQL和MS-SQL中有便宜些的东西吗? 问题答案: MySQL 不需要 ANY()聚合。 如果我做一个 微软的T-SQL会抱怨,但是 MySQL将只是默默地执行 当然哪一个比 MySQL支持 ,但 不起作用,因为它 是类似于 和的运算符 。 参见: http //dev.mysql.com/doc/refm

  • 问题内容: 我有这个查询: 想法是,计数将基于嵌套查询的结果,该查询将检索除第一个记录以外的该客户的所有记录。 但是,我遇到了这个错误,我认为这是很严重的错误: 1235-此版本的MySQL尚不支持“ LIMIT&IN / ALL / ANY / SOME子查询” 有人知道这样做的其他方式吗? 谢谢 问题答案: 这就是您需要进行的操作。请参阅我已经解决的示例。 希望这可以帮助。

  • 问题内容: 在本文http://www.jroller.com/eyallupu/entry/hibernate_the_any_annotation中,以及在此问题中,如何使用与Hibernate @Any相关的注释?,说明了如何使用@Any批注。但是我如何才能借到每张DVD / VHS / BOOK?如何在DVD / VHS / BOOK上映射定义? 问题答案: 我不 认为 这是受支持的,并且