作为试图理解scala的不同和相似之处的一部分,我试图理解Java“对象”类型的等价物是什么。
如果我有一个Scala列表类型,什么类型才能支持下面的ListTYPE,Any,(Int,Any))。
注意:我知道这是一种糟糕(糟糕)的编程技术,但这有助于我理解。
我最初认为ListAny可以工作,但不能让它在所有情况下都能工作:
[error] found : org.apache.spark.rdd.RDD[Any]
[error] required: org.apache.spark.rdd.RDD[(Any, ?)]类似的
[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是万物的超级类型,为什么在这里提到不变量?
发布于 2014-09-20 06:45:48
你说得对,Any是Scala中所有类型的超级类型。
错误消息是由不同的问题引起的。
[error] found : org.apache.spark.rdd.RDD[Any]
[error] required: org.apache.spark.rdd.RDD[(Any, ?)]在本例中,子类型和父类型混合在一起。错误指出您已经使用Any而不是(Any, ?),只有相反的方式是允许的。
[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])注释的。
协方差意味着如果类型A是B的子类型,并且Foo在其第一个类型参数中是协变的,那么Foo[A]就是Foo[B]的子类型。
Scala <:用于描述类型之间的顺序(子/超类型关系)。
(Any, (Any, Any)) <: Any意味着(Any, (Any, Any))是Any的一个子类型,但RDD不是协变的,因此RDD[(Any, (Any, Any))] <: RDD[Any]是错误的。
发布于 2014-09-20 05:32:50
您可以使用scala控制台和类型推断来检查您将拥有什么类型:
scala> val list = List(1, (2, "String"), Array.empty[Byte])
list: List[Any] = List(1, (2,String), Array())ListAny是正确的类型
https://stackoverflow.com/questions/25942629
复制相似问题