当前位置: 首页 > 面试题库 >

为什么int类型方法允许字符类型作为返回值?

傅琦
2023-03-14
问题内容

这是我的代码,但是我没有得到int getValue()方法如何接受char类型作为返回值。如何运作?谁能解释一下这种方法的工作原理

public class CharToInteger {
    private static Scanner input;
    public static int getValue(char character){
        return character;       
    }

    public static void main(String[] args) {
        input = new Scanner(System.in);
        System.out.println("Enter a character to get value of it:");
        String inputString=(String) input.next();
        char inputCharacter=inputString.charAt(0);
        System.out.println(getValue(inputCharacter));
    }

}

提前致谢 :)


问题答案:

好的,所以首先要做的是:

这是一个不断扩大的原始类型转换,因此这是合法的。您可以:

int foo() { return 'a' /* character constant */ };
long foo() { return 3; /* int constant */ }

但是您不能:

char foo() { return 1; /* int constant */ }
int foo() { return 1L; /* long constant */ }

第二:它返回的根本不是ASCII码。Java执行Unicode。

碰巧的是,当创建Java时,Unicode仅定义了适合16位的代码点。因此,它char被创建为2字节的无符号原始类型(这是Java中唯一的无符号原始类型),与当时所谓的UCS-2字符编码(编码和代码点之间的1到1映射)相匹配。

但是,此后,Unicode变得“宽泛”,并且出现了BMP之外的代码点(即大于U +
FFFF)。从那时起,UCS-2变成UTF-16,并且BMP之外的char代码点对于一个代码点需要2
s(一个前导代理和一个尾随代理;在以前的Unicode版本和Java API中,这些分别称为resp.high和低代理)。char因此,A
现在是UTF-16代码单元。


但是,对于BMP char中的代码点,该值与该代码点完全匹配,这仍然是正确的。

现在,为了“修复”程序以准确显示每个可能条目的“字符值”(即代码点),您可以这样做(Java 8):

public static void main(String[] args) {
    final Scanner input = new Scanner(System.in);
    System.out.println("Enter a character to get value of it:");
    String inputString =  input.next();
    // Print -1 on an empty input
    final OptionalInt codepoint = inputString.codePoints().findFirst();
    System.out.println(codepoint.isPresent() ? codepoint.get() : -1);
}

这还将处理BMP之外的代码点。



 类似资料:
  • 考虑以下代码: 我得到了错误 on-但我真的希望能够将类型检查移动到此函数中,因为这减少了我必须将类型检查到一个位置的次数。

  • 如果我在java中有一个抽象的(或据我所知的)超类,如下所示: 我注意到,在重写这个方法时,子类可以使用自身作为返回类型,但不能使用参数: 为什么不允许这样做?我不是在寻求解决方案——我知道我可以在方法中使用< code>instanceof检查或其他方法,我更想知道为什么前者是可以接受的,而后者对编译器来说却不是。

  • 现在我学习Java已经有一段时间了,但有一个概念我很难理解。我习惯了这样的方法 我知道上面的方法会返回一个整数或字符串,无论你想要什么数据类型 现在我在问自己,上述方法的回报类型到底是什么。我如何使用返回的东西做其他事情? 我还看到人们将对象作为这样的参数传递给方法 这又是怎么回事?在什么情况下,上述“风格”是必要的,需要避免什么陷阱? 使用对象而不是整数之类的值让我感到困惑。

  • 我有一个任务,我们要创造一个石头,纸,剪刀的游戏。它指定我们必须创建一个抽象的“工具”类,其中有三个子类:“ToolRock”、“ToolPaper”、“ToolScissors”。抽象类应该有一个“+getFeagnet():tool”函数(用斜体写成)。 我的假设是做一个像这样的抽象函数: RockTool类被指定为具有函数“+get弱点():tool”(不是用斜体写的),我的想法是创建一个覆

  • 下面对getHighest()和getLowest()的调用返回Comparable类型的对象,而不是T类型的对象,这正是我们想要的。为什么,我该如何改进这段代码,使这些调用返回T(这样T的字段和方法就可用了)? 下一行生成编译器错误: 错误:找不到符号符号:方法getName()位置:接口java.lang.Comparable 我想employee.getHighest()返回一个员工(而不仅