让
def h(a: AnyRef*) = a.mkString(",")
h: (a: AnyRef*)String
Run Code Online (Sandbox Code Playgroud)
所以
h("1","2")
res: String = 1,2
Run Code Online (Sandbox Code Playgroud)
然而, h(1,2)
error: the result type of an implicit conversion must be more specific than AnyRef
h(1,2)
^
error: the result type of an implicit conversion must be more specific than AnyRef
h(1,2)
^
Run Code Online (Sandbox Code Playgroud)
这至少在Scala 2.11.1和2.11.1中.询问解决方法.
我有一个Java类,它记录的东西有这样的方法:
void info(Object message, Object... params);
Run Code Online (Sandbox Code Playgroud)
在Scala中,我创建了一个围绕这样调用的包装器,如下所示:
def info(msg: => String, params: Any*) {
log.info(msg, params);
}
Run Code Online (Sandbox Code Playgroud)
我打电话的时候:
val host = "127.0.0.1"
val port = "1234"
info("Start on {0}:{1}", host, port)
Run Code Online (Sandbox Code Playgroud)
我明白了:
"Started on WrappedArray(127.0.0.1, 1234):{1}"
Run Code Online (Sandbox Code Playgroud)
现在,有没有人现在如何将params转换为可以正确使用的Object []?
我试着这样做:
def info(msg: => String, params: Any*)
log.info(msg, params.toList.toArray);
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
"Started on [Ljava.lang.Object;@14a18d:{1}"
Run Code Online (Sandbox Code Playgroud)
你做的时候会发生类似的事情:
params.asInstanceOf[WrappedArray[Object]].array
Run Code Online (Sandbox Code Playgroud) 我在下面编写了下面的Scala代码来处理我传入的String,格式化String,将其附加到a StringBuilder
并将String
带有转义的unicode 的格式化返回给我的调用者以进行其他处理.
Scala编译器在存在String.format
以下错误的调用行时抱怨以下内容:
带备选方法的重载方法值格式:
(x$1; java.util.Locale; x$2: String, X$3: Object*)
(x$1:String,x$2: Object*)
无法应用字符串(*String, Int)
class TestClass {
private def escapeUnicodeStuff(input: String): String = {
//type StringBuilder = scala.collection.mutable.StringBuilder
val sb = new StringBuilder()
val cPtArray = toCodePointArray(input) //this method call returns an Array[Int]
val len = cPtArray.length
for (i <- 0 until len) {
if (cPtArray(i) > 65535) {
val hi = (cPtArray(i) - 0x10000) / 0x400 + 0xD800
val lo = (cPtArray(i) …
Run Code Online (Sandbox Code Playgroud) 我在想,为什么AnyVal不能用于isInstanceOf检查?这种行为背后的原因是什么?
scala> val c = 't'
c: Char = t
scala> c.isInstanceOf[AnyVal]
<console>:12: error: type AnyVal cannot be used in a type pattern or isInstanceO
f test
c.isInstanceOf[AnyVal]
Run Code Online (Sandbox Code Playgroud) 考虑以下两个代码片段:
scala> def f1(x:Any) = x match { case i:String => i; case _ => null }
f1: (x: Any)String
scala> def f2(x:Any) = x match { case i:Int => i; case _ => null }
f2: (x: Any)Any
Run Code Online (Sandbox Code Playgroud)
为什么是f2
回归类型Any
,f1
而是String
?我期待要么返回Any
要么f2
返回Int
.
只是对类型Any
和AnyRef
Scala 中的区别感到好奇。为什么 int 属于AnyVal
而 string 属于AnyRef
?
例如:
val a: AnyVal = 3
val b: AnyRef = "1"
Run Code Online (Sandbox Code Playgroud) 我知道你可以直接从Scala访问java原语
val javaDouble = new java.lang.Double(1.0)
Run Code Online (Sandbox Code Playgroud)
这是否意味着我们通过包装器或直接访问基元?语法new java.lang.Double(1.0)
看起来像创建一个新对象,因此有一个包装器可以让我们访问java原语.如果这是真的,我想知道它需要多少额外的内存占用和计算.