Java 如何检查字符是否作为int传递
是否可以检查是否已将char传递到需要int的方法中? 例如,如果您有一些函数foo(intbar),而有人使用该函数,如foo('t'), 你能发现输入的是字符而不是int吗? 我知道char被转换成int,但是我试图限制通过函数的纯整数以外的任何东西Java 如何检查字符是否作为int传递,java,Java,是否可以检查是否已将char传递到需要int的方法中? 例如,如果您有一些函数foo(intbar),而有人使用该函数,如foo('t'), 你能发现输入的是字符而不是int吗? 我知道char被转换成int,但是我试图限制通过函数的纯整数以外的任何东西 干杯我不这么认为。我不这么认为。不,这是不可能的,因为Java本身可以将char升级为int 您可以对函数进行重载,使用char参数而不是int,该参数可能引发异常,但这不会阻止任何人将char转换为int并调用int版本 转换为整数的字符常量
干杯我不这么认为。我不这么认为。不,这是不可能的,因为Java本身可以将
char
升级为int
您可以对函数进行重载,使用char
参数而不是int
,该参数可能引发异常,但这不会阻止任何人将char
转换为int
并调用int
版本
转换为整数的字符常量'A'
与整数65之间完全没有区别,因此完全无法区分大小写
从Pax更新:
我认为显式强制转换不是传递char
,而是调用方将char
转换为int
,然后传递int
。此解决方案捕获了无意中传递的字符
从另一个答案中截取某人的代码,即:
public class Test {
private static void someMethod(char c) throws Exception {
throw new Exception("I don't think so, matey!");
}
private static void someMethod(int i) {
System.out.println(i);
}
public static void main(String[] args) throws Exception {
someMethod(100);
someMethod('d');
}
}
这导致:
100
Exception in thread "main" java.lang.Exception: I don't think so, matey!
at Test.someMethod(Test.java:4)
at Test.main(Test.java:13)
不,这是不可能的,因为Java本身可以将
char
升级为int
您可以对函数进行重载,使用char
参数而不是int
,该参数可能引发异常,但这不会阻止任何人将char
转换为int
并调用int
版本
转换为整数的字符常量'A'
与整数65之间完全没有区别,因此完全无法区分大小写
从Pax更新:
我认为显式强制转换不是传递char
,而是调用方将char
转换为int
,然后传递int
。此解决方案捕获了无意中传递的字符
从另一个答案中截取某人的代码,即:
public class Test {
private static void someMethod(char c) throws Exception {
throw new Exception("I don't think so, matey!");
}
private static void someMethod(int i) {
System.out.println(i);
}
public static void main(String[] args) throws Exception {
someMethod(100);
someMethod('d');
}
}
这导致:
100
Exception in thread "main" java.lang.Exception: I don't think so, matey!
at Test.someMethod(Test.java:4)
at Test.main(Test.java:13)
除非整数被限制在字符范围之外的范围内,否则无法执行此操作,因为无法判断值64是整数还是字符。除非整数被限制在字符范围之外的范围内,由于无法判断值64是int还是char,因此无法执行此操作。您可以使用Integer而不是int
void foo(Integer bar) { }
如果您试图调用foo('A'),您将得到一个编译器错误。您可以使用Integer而不是int
void foo(Integer bar) { }
如果试图调用foo('A'),则会出现编译器错误。将
char
转换为int
将在编译时发生,因此无法确定是传入了char
,还是传入了int
为了举例说明,让我们检查一个程序的源代码和生成的字节码,该程序有一个somethod(int)
,通过传递char
和int
来调用:
源代码:
class CharIntCast
{
private static void someMethod(int i)
{
}
public static void main(String[] args)
{
someMethod(100);
someMethod('d');
}
}
字节码:
Compiled from "CharIntCast.java"
class CharIntCast extends java.lang.Object{
CharIntCast();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private static void someMethod(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: bipush 100
2: invokestatic #2; //Method someMethod:(I)V
5: bipush 100
7: invokestatic #2; //Method someMethod:(I)V
10: return
}
从“CharIntCast.java”编译而来
类CharIntCast扩展了java.lang.Object{
CharIntCast();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
私有静态方法(int);
代码:
0:返回
公共静态void main(java.lang.String[]);
代码:
0:bipush 100
2:invokestatic#2;//方法someMethod:(I)V
5:bipush 100
7:invokestatic#2;//方法someMethod:(I)V
10:返回
}
从字节码中可以看出,在调用someMethod
之前,当值100
和'd'
被bipush
指令推送到堆栈上时,这两个值都已作为整数处理
因此,在运行时,无法确定方法参数是
int
还是char
,因为强制转换是由编译器执行的。将char
强制转换为int
,因此,无法确定是传入了char
,还是传入了int
为了举例说明,让我们检查一个程序的源代码和生成的字节码,该程序有一个somethod(int)
,通过传递char
和int
来调用:
源代码:
class CharIntCast
{
private static void someMethod(int i)
{
}
public static void main(String[] args)
{
someMethod(100);
someMethod('d');
}
}
字节码:
Compiled from "CharIntCast.java"
class CharIntCast extends java.lang.Object{
CharIntCast();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private static void someMethod(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: bipush 100
2: invokestatic #2; //Method someMethod:(I)V
5: bipush 100
7: invokestatic #2; //Method someMethod:(I)V
10: return
}
从“CharIntCast.java”编译而来
类CharIntCast扩展了java.lang.Object{
CharIntCast();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
私有静态方法(int);
代码:
0:返回
公共静态void main(java.lang.String[]);
代码:
0:bipush 100
2:invokestatic#2;//方法someMethod:(I)V
5:bipush 100
7:invokestatic#2;//方法someMethod:(I)V
10:返回
}
从字节码中可以看出,在调用someMethod
之前,当值100
和'd'
被bipush
指令推送到堆栈上时,这两个值都已作为整数处理
因此,在运行时,无法确定方法参数是int
还是char
,因为强制转换是由编译器执行的
我正试图限制其他任何事情
而不是纯整数通过
功能
您在概念上与Java有点不匹配。Java中的char
只是一个数字;事实是