2011-12-29 104 views
4

如果我寫:如何從Scala返回「原始Java char」?

def getShort(b: Array[Byte]): Short 
在斯卡拉

,我得到了Java的原始短,這是罰款。但是,如果我寫的:

高清的getchar(B:數組[字節]):夏亞

我得到一個scala.Char對象,這是不正常。如果我寫:

def getChar(b: Array[Byte]): Character 

我得到一個java.lang.Character中,這是不罰款要麼。

如果Scala「Char」不是Java「char」,而Scala「Character」不是Java「char」,那麼剩下的是什麼?

回答

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! 

人們需要對classpath中的tools.jar爲:javap工作,順便說一句。它包含在Sun/Oracle JVM中。

+0

*我沒有錯。 Eclipse是!很煩人!它給了我一個錯誤,說我得到一個scala.Char而不是一個字符,但在控制檯它的作品! – 2011-12-29 19:04:06

+0

更好地提交錯誤報告,如果它尚未存在(並且尚未修復,並且您喜歡使用IDE)。 – 2011-12-29 19:09:57

-1

在大多數情況下,java.lang.Character對於Java來說和Java一樣好。如果你真的需要原始的,你可以返回charValue()關閉對象

+0

我的觀點是我不想爲每個字符創建一個對象;畢竟,我不必爲所有其他原始類型做這件事。 – 2011-12-29 18:51:25

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 
+0

是的,Eclipse再次取笑我。 – 2011-12-29 19:04:27

3

Scala的Charscala.Char,這是同樣的事情char,就像AnyRef是一回事Object。對於JVM,它是char,對於Scala來說,它是scala.Char