2013-12-06 4 views
-1

Я исхожу из фона Python и работаю через некоторые обучающие программы Java (новые для языка) и изо всех сил пытаюсь понять ошибку, которую я получаю.Почему «на лету» кастинг дает мне ошибку компиляции в 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 говорит, что приведение вещей по необходимости - это не-go, но тогда почему моя программа компилируется и работает отлично?

+0

Я думаю Fahr объявлен как двойной примитивными? –

+1

Я не совсем понимаю. Вы говорите, что компилятор дает ошибку, но вы также говорите, что программа отлично компилируется. Это звучит как противоречие со мной. Возможно, вы все еще используете какую-то старую версию, потому что второй фрагмент действительно не работает. –

+0

Как код, который не скомпилирует работу отлично ?! – Blub

ответ

2

Это создает новый двойное:

fahr = new Double(fahrString);

Рядный эквивалент будет:

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

, который для записи, не литой, а создание нового объекта, который разбирает ул кольцо. Никакой язык, который я знаю (даже python), позволяет вам переводить из String в double. В Python есть просто нет нового оператора и так:

cel = double(fahrString)

будет по-прежнему создавать новый объект.

+0

Спасибо, я сбивал с толку создание с созданием объекта. – henrebotha

4

Если вы хотите, чтобы бросить его в два раза попробовать следующие

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

Или

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

Я думаю, что лучше использовать Double.parseDouble(fahrString) так, насколько я вижу, что вы пытаетесь бросить Строка удваивается.

То, как вы пытались ошибаться, это не способ кастинга.

+0

Это не отвечает на мой вопрос. Он также дает ту же ошибку, что и раньше. – henrebotha

+2

@henrebotha это будет работать нормально. Присмотритесь ближе –

+0

Я вижу, что вы говорите, но это не отвечает на мой вопрос. Он исправляет мой код, но он не отвечает на то, что я на самом деле спрашиваю. – henrebotha

2

Литье осуществляется следующим образом:

(Double)fahrstring 

Не нравится:

Double(fahrstring) 

Java интерпретирует последний, как вы пытаетесь вызвать метод с именем Double, который является причиной, почему она жалуется на его не может найти символ (у вас нет метода под названием Double)

Кстати, если нет конкретных причин для использования Double, я бы рекомендовал вместо этого использовать примитивный эквивалент double.

+0

Спасибо, это очень помогает. В учебнике, в котором я занят, речь идет о примитивах против объектов, поэтому, вероятно, они используют «Двойной». – henrebotha

+1

@henrebotha Как вы можете сказать, что это помогает, но ответа Ручиры нет? Это бессмысленно. Хотя это объяснение может быть более информативным, код тот же. –

+0

Потому что объяснение более информативное. Я не спрашивал, как правильно делать вещи, я спрашивал, почему метод, который я использовал, выдавал ошибку И работал. – henrebotha

0

Вы просто пропустили некоторые скобки;)

fahrString = JOptionPane.showInputDialog("Enter the temperature in F"); 
cel = ((Double)fahrString - 32) * 5.0/9.0; 
0

Double.parseDouble(String) для преобразования строкового литерала в двойное значение, если строковое значение действует для двойного преобразования

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

Это самый простой способ разбора строки в двойное значение. Это будет бросить NPE при передаче строка литерала нуля/NumberFormatException, когда переданная строка буквальная не является допустимой строкой для выполнения двойного преобразования

+0

В чем разница между использованием 'parseDouble()' vs с помощью приведения или создания нового объекта 'Double'? – henrebotha

+1

parseDouble (Str), используемый для преобразования двойного значения в формате String в фактическое двойное значение. то есть «98,0» -> 98,0. Это не создаст новый экземпляр объекта Double, вместо этого он вернет двойное примитивное значение. Есть два типа броска. т.е. повышать и понижать. это полезно, когда вы хотите передать байты из одного контейнера в другой контейнер. Поскольку String и Double являются контейнерами с равным размером байта, они могут быть отброшены компилятором – Keerthivasan

0

Попробуйте

cel = ((Double.parseDouble(fahrString)) - 32) * 5.0/9.0; 
Смежные вопросы