Java 从双精度到双精度的类强制转换异常
为什么类将异常从Double强制转换为Double 用法如下:Java 从双精度到双精度的类强制转换异常,java,Java,为什么类将异常从Double强制转换为Double 用法如下: Console.writeLine(Validator.TryParse("1.5", double.class)); 代码: publicstaticttryparse(objectconvertfrom,java.lang.Class ConvertTo){ 开关(ConvertTo.getSimpleName().toLowerCase()){ 案例“int”: 大小写“integer”:返回ConvertTo.cast((
Console.writeLine(Validator.TryParse("1.5", double.class));
代码:
publicstaticttryparse(objectconvertfrom,java.lang.Class ConvertTo){
开关(ConvertTo.getSimpleName().toLowerCase()){
案例“int”:
大小写“integer”:返回ConvertTo.cast((int)integer.parseInt((String)ConvertFrom));
大小写“string”:返回ConvertTo.cast(string.valueOf(ConvertFrom));
大小写“double”:返回ConvertTo.cast((double)double.parseDouble((String)ConvertFrom));
大小写“float”:返回ConvertTo.cast((float)float.parseFloat((String)ConvertFrom));
大小写“long”:返回ConvertTo.cast((long)long.parseLong((String)ConvertFrom));
默认值:返回null;
}
}
您正在混合原语和装箱原语。调用TryParse(“1.5”,Double.class)
可以很好地工作(您可以删除所有不必要的基元强制转换,如(int)
(Double)
等)
您遇到的问题是Class#cast
首先检查Class#isInstance
并:
Double.class.isInstance(1.0);
确实如此,但:
double.class.isInstance(Double.valueOf(1.0))
double.class.isInstance(1.0d)
如表中所解释的,是错误的
如果该类对象表示基元类型,则该方法返回false
底线:
primitive.class.cast()
将始终引发异常。应该如下所示,请注意Double中的大写字母
Console.writeLine(Validator.TryParse("1.5", Double.class));
您可以使用
Double.doubleValue()
和Integer.intValue()
更多阅读:
社论:
似乎您正在尝试做一些非常不自然和非Java的事情(Java是一种类型化语言,这是有原因的)。如果每次调用验证器时仍需要定义类,为什么不使用每个类的valueOf方法呢?Integer和Double等对象类将能够处理原语和返回对象
正如之前所问的,您确定需要实现此功能吗?你可能想回顾一下你的设计。是的,我确定:如果我确定,你是什么意思。。C++没有“对象”。或字符串。是的,但C是字符串而不是字符串。@dasblinkenlight我也在想,但是
java.lang.Class
毫无疑问;-)Console.writeLine
把我甩了。。。我还以为是C#:它既允许string
又允许string
.K。那么你是说原语的“盒装”版本不能转换为原语类型?你是认真的吗?C#允许这样做。。那么另一条路是什么呢。。将两者分开考虑?这样做没有意义:S@CantChooseUsernames:不能对基元类型调用.class
。@CantChooseServerNames不能按您的方式对其进行强制转换double.class.cast(double.valueOf(1.0d))
@CantChooseServerNames-你到底为什么要实现这样一种方法@老实说,我发现Validator.TryParse(“1.5”,double.class)
(以及与之配套的所有代码)比double.parseDouble(“1.5”)复杂得多代码>但它可能对您的用例有意义(实际上,如果您解释了您的最终目标是什么,您可能会发现有一种不同的方法)。但是我需要一个单独的“Double”和“Double”用例,如果类型不可铸造,那么我该怎么做:Double J=10;双I=J?这是一个隐式的演员阵容,而且很有效。
Console.writeLine(Validator.TryParse("1.5", Double.class));