【问题标题】:How to return a "primitive Java char" from Scala?如何从 Scala 返回“原始 Java 字符”?
【发布时间】:2012-01-29 23:20:35
【问题描述】:

如果我写:

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",那么还剩下什么?

【问题讨论】:

    标签: java scala char


    【解决方案1】:

    你错了; 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 需要在 classpath 上有 tools.jar 才能工作。它包含在 Sun/Oracle JVM 中。

    【讨论】:

    • 没记错。日食是!很烦人!它给了我一个错误,说我得到了 scala.Char 而不是 char,但在控制台上它可以工作!
    • 最好提交一个错误报告,如果它还没有(并且尚未修复,并且您喜欢使用 IDE)。
    【解决方案2】:

    我相信两者都会解析为原语。

    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
    

    【讨论】:

    • 是的,Eclipse 又取笑我了。
    【解决方案3】:

    Scala 的Charscala.Char,与char 相同,就像AnyRefObject 相同。对于 JVM,它是 char,对于 Scala,它是 scala.Char

    【讨论】:

      【解决方案4】:

      java.lang.Character 对于大多数用途而言,对 java 的使用与原始使用一样好。如果你真的需要原语,你可以返回 charValue() off object

      【讨论】:

      • 我的意思是我不想为每个字符创建一个对象;毕竟,我不必对所有其他原始类型都这样做。
      猜你喜欢
      • 2012-12-12
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多