关于什么类型的归属,规范中没有太多信息,并且当然没有关于它的目的的任何信息.除了"使传递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) 请考虑以下代码:
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列表转换为数组.
我正试图弄清楚如何做以下事情:
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)
这无法使用隐式转换歧义进行编译(any2ArrowAssoc和any2stringadd)
我有一个火花数据框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中的东西
如何对这种地图进行排序:
"01" -> List(34,12,14,23), "11" -> List(22,11,34)
Run Code Online (Sandbox Code Playgroud)
由初值?
可能重复: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中的定义在哪里?
我有一个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.我错过了一些基本的东西吗?
我猜测,出于兼容性原因,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或序列的构造函数呢?
我目前正在将应用程序的一部分移植到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)
我怎样才能明白这一点?
我有一个像这样的现有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)
我怎样才能通过论证?
scala ×9
java ×2
apache-spark ×1
arrays ×1
ascription ×1
constructor ×1
map ×1
sorting ×1
types ×1
xml ×1