相关疑难解决方法(0)

Scala中类型归属的目的是什么?

关于什么类型的归属,规范中没有太多信息,并且当然没有关于它的目的的任何信息.除了"使传递varargs工作",我会使用什么类型的归属?下面是一些scala REPL的语法和使用它的效果.

scala> val s = "Dave"
s: java.lang.String = Dave

scala> val p = s:Object
p: java.lang.Object = Dave

scala> p.length
<console>:7: error: value length is not a member of java.lang.Object
       p.length
         ^
scala> p.getClass
res10: java.lang.Class[_ <: java.lang.Object] = class java.lang.String

scala> s.getClass
res11: java.lang.Class[_ <: java.lang.Object] = class java.lang.String

scala> p.asInstanceOf[String].length
res9: Int = 4
Run Code Online (Sandbox Code Playgroud)

scala static-typing ascription

71
推荐指数
2
解决办法
1万
查看次数

如何将Scala数组传递给Scala vararg方法?

请考虑以下代码:

private def test(some:String*){

}

private def call () {
  val some = Array("asd", "zxc")
  test(some)
}
Run Code Online (Sandbox Code Playgroud)

它打印expect String, found Array[String]为什么?Scala varargs不是数组吗?

注意

我在Stack Overflow上发现了几个关于Scala varargs的问题,但所有这些问题都是关于调用Java varargs方法或将Scala列表转换为数组.

arrays scala variadic-functions

62
推荐指数
2
解决办法
3万
查看次数

使用Scala的varargs

我正试图弄清楚如何做以下事情:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, o :: List(os:_*)) )
}
Run Code Online (Sandbox Code Playgroud)

有一个原因,我必须单独声明方法o和一个os Seq.基本上,我最终得到了使用单个对象参数(类型List)调用的格式方法.尝试:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, (o :: List(os:_*))).toArray )
}
Run Code Online (Sandbox Code Playgroud)

给我类型错误:

发现:数组[任意]

必需的Seq [java.lang.Object]

我尝试过编译,编译但失败的原因和第一个例子差不多.当我尝试

println(String.format(msg, (o :: List(os:_*)) :_* ))
Run Code Online (Sandbox Code Playgroud)

这无法使用隐式转换歧义进行编译(any2ArrowAssocany2stringadd)

scala variadic-functions

54
推荐指数
2
解决办法
5万
查看次数

上传列表以从火花数据框中选择多个列

我有一个火花数据框df.有没有办法使用这些列的列表选择几列?

scala> df.columns
res0: Array[String] = Array("a", "b", "c", "d")
Run Code Online (Sandbox Code Playgroud)

我知道我可以做点什么df.select("b", "c").但是假设我有一个包含几个列名的列表val cols = List("b", "c"),有没有办法将它传递给df.select?df.select(cols)抛出错误.像df.select(*cols)python中的东西

apache-spark apache-spark-sql spark-dataframe

47
推荐指数
3
解决办法
5万
查看次数

Scala地图排序

如何对这种地图进行排序:

"01" -> List(34,12,14,23), "11" -> List(22,11,34)
Run Code Online (Sandbox Code Playgroud)

由初值?

sorting scala map

24
推荐指数
2
解决办法
3万
查看次数

什么:_*从Scala调用Java vararg方法时做什么?

可能重复:Scala
:_*(冒号下划线明星)做了什么?

我正在使用REPL来调用带有Scala数组的Java vararg方法.

如果我这样做,我会收到错误:

case class Person(name: String, age: Int)
val array = Array(classOf[String], classOf[Int])
Person.getClass.getMethod("apply", array)
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,那么它的工作原理:

Person.getClass.getMethod("apply", array:_*)
Run Code Online (Sandbox Code Playgroud)

我的问题是:_*做什么的?它在Scala API中的定义在哪里?

java scala

24
推荐指数
1
解决办法
7734
查看次数

Scala XML Building:将子节点添加到现有节点

我有一个XML节点,我希望随着时间的推移添加子节点:

val root: Node = <model></model>
Run Code Online (Sandbox Code Playgroud)

但我看不到像addChild()这样的方法,因为我想写下以下内容:

def addToModel() = {
    root.addChild(<subsection>content</subsection>)
}
Run Code Online (Sandbox Code Playgroud)

因此,在单个调用此方法之后,根xml将是:

<model><subsection>content</subsection></model>
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一可以附加节点的类是NodeBuffer.我错过了一些基本的东西吗?

xml scala

22
推荐指数
3
解决办法
2万
查看次数

Scala:构造函数采用Seq或varargs

我猜测,出于兼容性原因,vararg参数的类型Any*是Array [Any] - 如果我错了,请更正.但是,这并不能解释以下错误:

class Api(api_url: String, params: Seq[(String, String)]) {
  def this(api_url: String, params: (String, String)*)
    = this(api_url, params.seq)
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,但会发出警告:

double definition:构造函数Api:(api_url:String,params:(String,String)*)Api和构造函数Api:(api_url:String,params:Seq [(String,String)])第13行的Api在擦除后具有相同的类型:(api_url:java.lang.String,params:Seq)Api

那么如何定义一个采用varargs或序列的构造函数呢?

constructor types scala variadic-functions

20
推荐指数
2
解决办法
1万
查看次数

Scala - 对重载定义的模糊引用 - 使用varargs

可能重复:
如何在使用vararg和不使用vararg的方法之间消除Scala中的歧义

我目前正在将应用程序的一部分移植到scala,它使用Oval库.方法问题是Validator.validate方法.它有两个 签名:

List<ConstraintViolation> validate(Object validatedObject)
List<ConstraintViolation> validate(Object validatedObject, String... profiles) 
Run Code Online (Sandbox Code Playgroud)

scala代码看起来通常如下:

def validate(toValidate: AnyRef) = {
  val validator = createValidator
  validator.validate(toValidate)
}
Run Code Online (Sandbox Code Playgroud)

并且错误消息:

error: ambiguous reference to overloaded definition,
[INFO] both method validate in class Validator of type (x$1: Any,x$2: <repeated...>[java.lang.String])java.util.List[net.sf.oval.ConstraintViolation]
[INFO] and  method validate in class Validator of type (x$1: Any)java.util.List[net.sf.oval.ConstraintViolation]
[INFO] match argument types (AnyRef)
[INFO]       this.validator.validate(toValidate)
Run Code Online (Sandbox Code Playgroud)

我怎样才能明白这一点?

scala scala-java-interop

15
推荐指数
2
解决办法
9152
查看次数

如何将Scala Seq传递给Java varargs

我有一个像这样的现有Java方法:

public static MyJavaClass javaFunc(String name, long... values) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我需要用Scala来调用它:

val idList: Seq[Long] = Seq(1L, 2L, 3L)

MyJavaClass.javaFunc("hello", idList)
Run Code Online (Sandbox Code Playgroud)

但它最终会在idList参数上调用toString方法.我试过以下无济于事:

MyJavaClass.javaFunc("hello", idList:_*)
Run Code Online (Sandbox Code Playgroud)

这会导致编译错误:

no `: _*' annotation allowed here (such annotations are only allowed in arguments to *-parameters)
Run Code Online (Sandbox Code Playgroud)

我怎样才能通过论证?

java scala variadic-functions

11
推荐指数
1
解决办法
2723
查看次数