如果我写:
def getShort(b: Array[Byte]): Short
在Scala中,我在Java中获得了原始的简短,这很好。但如果我写:
def getChar(b:Array [Byte]):Char
我得到一个scala.Char对象,这不对。如果我写:
def getChar(b: Array[Byte]): Character
我得到了一个java.lang.Character,这也不错。
如果Scala“Char”不是Java“char”,而Scala“Character”不是Java“char”,那还剩下什么?
答案 0 :(得分:10)
Char
是 Java原始字符。观察:
scala> class IsPrimitiveChar {
| def myChar(i: Int): Char = i.toChar // I am clearly a Char, whatever that is!
| }
defined class IsPrimitiveChar
scala> :javap IsPrimitveChar
Compiled from "<console>"
public class IsPrimitiveChar extends java.lang.Object implements scala.ScalaObject{
public char myChar(int); // Look, it returns a char!
public IsPrimitiveChar();
}
scala> :javap -c -private IsPrimitiveChar
Compiled from "<console>"
public class IsPrimitiveChar extends java.lang.Object implements scala.ScalaObject{
public char myChar(int);
Code:
0: iload_1
1: i2c // Look, primitive int to char conversion in bytecode!
2: ireturn // And that's all!
顺便说一句,需要在类:javap
的类路径上使用tools.jar。它包含在Sun / Oracle JVM中。
答案 1 :(得分:3)
我相信两者都会解决原始问题。
scala> def getShort(b: Array[Byte]): Short = 0
getShort: (b: Array[Byte])Short
scala> getShort(Array(1))
res10: Short = 0
scala> getShort(Array(1)).getClass().getName()
res11: java.lang.String = short
scala> def getChar(b: Array[Byte]): Char = 'a'
getChar: (b: Array[Byte])Char
scala> getChar(Array(1))
res13: Char = a
scala> getChar(Array(1)).getClass().getName()
res14: java.lang.String = char
答案 2 :(得分:3)
Scala Char
为scala.Char
,与char
相同,就像AnyRef
与Object
相同。对于JVM,它是char
,对于Scala,它是scala.Char
。
答案 3 :(得分:-1)