Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查字符是否作为int传递_Java - Fatal编程技术网

Java 如何检查字符是否作为int传递

Java 如何检查字符是否作为int传递,java,Java,是否可以检查是否已将char传递到需要int的方法中? 例如,如果您有一些函数foo(intbar),而有人使用该函数,如foo('t'), 你能发现输入的是字符而不是int吗? 我知道char被转换成int,但是我试图限制通过函数的纯整数以外的任何东西 干杯我不这么认为。我不这么认为。不,这是不可能的,因为Java本身可以将char升级为int 您可以对函数进行重载,使用char参数而不是int,该参数可能引发异常,但这不会阻止任何人将char转换为int并调用int版本 转换为整数的字符常量

是否可以检查是否已将char传递到需要int的方法中? 例如,如果您有一些函数foo(intbar),而有人使用该函数,如foo('t'), 你能发现输入的是字符而不是int吗? 我知道char被转换成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
只是一个数字;事实是