是否可以检查是否已将char传递给需要int的方法? 例如,如果你有一些函数foo(int bar),有人使用像foo('t')这样的函数, 你是否能够发现输入了一个字符而不是一个int? 我知道char被转换为int但是我试图限制除纯粹整数之外的任何东西。
干杯
答案 0 :(得分:9)
不,这是不可能的,因为如果可以,Java本身会将char
升级为int
。
你可以使用char
参数代替可能引发异常的int
的函数重载,但这不会阻止任何人将char
转换为int
int
并调用'A'
版本。
在转换为整数的字符常量char
与整数65之间完全没有区别,因此完全不可能区分这些情况。
从Pax更新:
我认为显式转换不会传递char
,而是调用者将int
转换为int
然后传递char
。该解决方案无意中传递了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)
这导致:
{{1}}
答案 1 :(得分:8)
您可以使用Integer而不是int。
void foo(Integer bar) { }
如果您尝试调用foo('A'),您将收到编译器错误。
答案 2 :(得分:4)
我试图限制其他任何东西 比纯粹的整数通过 功能
你在与Java有一点概念上的不匹配。 Java中的char
只是一个数字;您使用类型char
而不是类型int
的事实是因为您需要一个16位而不是32位的数字。
char
只是一个从0到65535的数字。int
只是一个从-2,147,483,648到2,147,483,647的数字。
现在,我知道您希望阻止人们使用foo('t')
等无意义的事情来调用您的方法。但是,只要编译程序,Java实际上会将此调用转换为foo(116)
。
实际上,有人用一个字符作为参数调用你的方法就像用一个任意数字调用你的方法一样愚蠢。如果你遇到这种情况,请考虑以下几种可能性:
某些字符是否会对您的方法产生无效的输入?
例如,您希望亮度值介于0到255之间,而setBrightness('Δ')
实际上是setBrightness(916)
。
抛出异常 - 无论如何你应该这样做!
您是否希望解析表示数值的字符?
例如,您希望亮度值介于0到9之间,而setBrightness('5')
实际上应为setBrightness(5)
。
将字符解析为字符串。
_
char a = '5';
String a_s = String.valueOf(a);
int a_i = Integer.parseInt(a_s);
setBrightness(a_i)
该方法是否正确执行所有操作,但将字符作为参数传递是愚蠢的?
例如,您希望亮度值在0到1,000,000之间,而setBrightness('q')
只是以错误的方式摩擦你。
不管它。调用setBrightness('q')
是不好的形式,但这是另一个编码器的问题。不要自己做!当你在挖掘Unicode表时试图找出你当时的意思,你会在以后踢自己。
答案 3 :(得分:3)
char
到int
的转换将在编译时发生,因此无法确定是否传入char
或int
传入。
为了说明,让我们检查一下程序的源代码和结果字节码,该程序的someMethod(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
}
从字节码中可以看出,值100
和'd'
在进行调用之前被bipush
指令压入堆栈时已经作为整数处理到someMethod
。
因此,在运行时,无法确定方法参数是int
还是char
,因为转换是由编译器执行的。
答案 4 :(得分:1)
我不这么认为。
答案 5 :(得分:0)
除非你的整数被限制在超出char范围的范围内,否则你不能这样做,因为你无法分辨值64是int还是char。