“为什么?”;“在飞行中”;在Java中给我一个编译错误?

“为什么?”;“在飞行中”;在Java中给我一个编译错误?,java,casting,Java,Casting,我来自Python背景,正在学习一些Java教程(该语言的新手),并努力理解我遇到的一个错误 这段代码工作得很好: fahrString = JOptionPane.showInputDialog("Enter the temperature in F"); fahr = new Double(fahrString); cel = (fahr - 32) * 5.0/9.0; 但是这个代码也可以完美地工作 fahrString = JOptionPane.showInputDialog("En

我来自Python背景,正在学习一些Java教程(该语言的新手),并努力理解我遇到的一个错误

这段代码工作得很好:

fahrString = JOptionPane.showInputDialog("Enter the temperature in F");
fahr = new Double(fahrString);
cel = (fahr - 32) * 5.0/9.0;
但是这个代码也可以完美地工作

fahrString = JOptionPane.showInputDialog("Enter the temperature in F");
cel = (Double(fahrString) - 32) * 5.0/9.0;
…但给出了一个编译器错误:

TempConvGUI.java:12: cannot find symbol
symbol  : method Double(java.lang.String)
location: class TempConvGUI
        cel = (Double(fahrString) - 32) * 5.0/9.0;
               ^
1 error

为什么呢?我可以理解,如果Java说按需转换是不可能的,那么为什么我的程序编译和运行得很好呢?

如果您想将其转换为双精度,请尝试以下操作

((double)fahrString - 32) * 5.0/9.0;

我认为最好使用
Double.parseDouble(fahrString)
,因为据我所知,您正在尝试将字符串转换为Double


你尝试的方式是错误的,那不是铸造的方式

铸造是这样完成的:

(Double)fahrstring
Double(fahrstring)
不是这样的:

(Double)fahrstring
Double(fahrstring)
Java将后者解释为您试图调用名为
Double
的方法,这就是它抱怨找不到符号的原因(您没有名为
Double
的方法)


顺便说一句,如果没有具体的理由使用双精度
Double
,我建议使用原语等价物
Double

您刚才遗漏了一些括号;)

Double.parseDouble(String)
要将字符串文字转换为双精度值,前提是字符串值对双精度转换有效

cel = (Double.parseDouble(fahrString) - 32) * 5.0/9.0;

这是将字符串解析为双精度值的最简单方法。当传递的字符串文本为null时,将抛出NPE;当传递的字符串文本不是进行双精度转换的有效字符串时,将抛出NumberFormatException

这将构造一个新的双精度值:

cel = (Double.parseDouble(fahrString) - 32) * 5.0/9.0;
fahr=新的双精度(fahrString)

内联等价物为:

cel=(新双精度(fahrString)-32)*5.0/9.0

对于记录,这不是强制转换,而是创建一个新对象来解析字符串。我所知道的任何语言(甚至python)都不允许从字符串转换为双精度。python中没有新的运算符,因此:

cel=double(fahrString)

仍将创建新对象。

请尝试

cel = ((Double.parseDouble(fahrString)) - 32) * 5.0/9.0;

这根本不能回答我的问题。我明白你的意思,但它没有回答我的问题。它修复了我的代码,但没有回答我的实际问题。
fahrString
是一个
字符串
,因为
JOptionPane.showInputDialog()
返回一个
字符串
。你怎么能把它转换成双精度?@henrebotha编译错误意味着你的代码是错误的,这是最好的解释。我们不认为你所做的是casting@Ren艾琳:我不知道,我对这个很陌生我猜fahr被声明为双重原语?我不完全理解。你说编译器出错,但你也说程序编译得很好。这听起来像是自相矛盾。也许您仍然在运行一些旧版本,因为第二个代码段真的不起作用。不编译的代码怎么能工作得很好?!我已经弄明白了为什么程序仍然运行——我使用的是Sublime Text 2,在出现编译错误时,它继续运行旧版本的.class。我很高兴我现在意识到了这一点,以后可能会引起很多头痛。谢谢你,这很有帮助。我正在学习的教程专门讨论了原语和对象,这可能就是为什么他们使用
Double
@henrebotha,你怎么能说这有帮助,但Ruchira的答案没有?这毫无意义。虽然这个解释可能更具信息性,但代码是一样的,因为这个解释更具信息性。我不是在问如何正确地投射,我是在问为什么我使用的方法会出现错误并运行。@henrebotha我认为这是有道理的,你所做的不是casting@EdgarBoda:不,我没有。再次阅读我的问题。谢谢,我把强制转换与创建对象混淆了。使用
parseDouble()
与使用强制转换或实例化新的
Double
对象有什么区别?parseDouble(Str)用于将字符串格式的双精度值转换为实际的双精度值。i、 e.“98.0”->98.0。这不会创建Double对象的任何新实例,而是返回Double原语值。有两种类型的铸件。i、 e.向上和向下。当您想要将字节从一个容器传输到另一个容器时,它非常有用。由于String和Double是相同字节大小的容器,因此编译器允许对它们进行强制转换