首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala数据类型

Scala数据类型
EN

Stack Overflow用户
提问于 2014-09-20 05:30:18
回答 2查看 701关注 0票数 2

作为试图理解scala的不同和相似之处的一部分,我试图理解Java“对象”类型的等价物是什么。

如果我有一个Scala列表类型,什么类型才能支持下面的ListTYPE,Any,(Int,Any))。

注意:我知道这是一种糟糕(糟糕)的编程技术,但这有助于我理解。

我最初认为ListAny可以工作,但不能让它在所有情况下都能工作:

代码语言:javascript
复制
[error]  found   : org.apache.spark.rdd.RDD[Any]
[error]  required: org.apache.spark.rdd.RDD[(Any, ?)]

类似的

代码语言:javascript
复制
[error]  found   : org.apache.spark.rdd.RDD[(Any, (Any, Any))] [error] required: org.apache.spark.rdd.RDD[Any] [error] Note: (Any, (Any, Any)) <: Any, but class RDD is invariant in type T.

如果Any是万物的超级类型,为什么在这里提到不变量?

EN

回答 2

Stack Overflow用户

发布于 2014-09-20 06:45:48

你说得对,Any是Scala中所有类型的超级类型。

错误消息是由不同的问题引起的。

代码语言:javascript
复制
[error]  found   : org.apache.spark.rdd.RDD[Any]
[error]  required: org.apache.spark.rdd.RDD[(Any, ?)]

在本例中,子类型和父类型混合在一起。错误指出您已经使用Any而不是(Any, ?),只有相反的方式是允许的。

代码语言:javascript
复制
[error]  found   : org.apache.spark.rdd.RDD[(Any, (Any, Any))] [error] required: org.apache.spark.rdd.RDD[Any] [error] Note: (Any, (Any, Any)) <: Any, but class RDD is invariant in type T.

这里的问题是多态和方差注释。如果类型变量是不变的(既不是协变的,也不是逆变的),则该类型必须是完全匹配的。您不能改用子类型或超类型。

协方差

为了允许您的第二个用例,RDD中的类型参数应该是协变的。Scala中的协方差是用+ (例如class RDD[+T])注释的。

协方差意味着如果类型AB的子类型,并且Foo在其第一个类型参数中是协变的,那么Foo[A]就是Foo[B]的子类型。

Scala <:用于描述类型之间的顺序(子/超类型关系)。

代码语言:javascript
复制
(Any, (Any, Any)) <: Any

意味着(Any, (Any, Any))Any的一个子类型,但RDD不是协变的,因此RDD[(Any, (Any, Any))] <: RDD[Any]是错误的。

票数 3
EN

Stack Overflow用户

发布于 2014-09-20 05:32:50

您可以使用scala控制台和类型推断来检查您将拥有什么类型:

代码语言:javascript
复制
scala> val list = List(1, (2, "String"), Array.empty[Byte])
list: List[Any] = List(1, (2,String), Array())

ListAny是正确的类型

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25942629

复制
相关文章

相似问题

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