2016-09-16 3 views
0

Почему Java бросает точки чисел, чтобы удвоить? Когда я бросаю его, он работает. Но, по-моему, это не красиво.Автоматическое приведение к двойному параметру

Мои методы могут быть изменены для двойного подписи. Но когда я импортирую что-то, я не нахожу решения.

public class Demo { 

    public static void main(String[] args) { 
     run(0.1); 
     run(1*0.1); 
     run(1); 
     importedClass.setPosition(0.1, 3.5); 
     //setPosition(float, float) not applicable for the arguments (double, double) 
     run((float) 0.1); 
     run((float) 1*0.1); 
     run(1); 
     importedClass.setPosition((float) 0.1, (float) 3.5); 
    } 

    public static void run(float x) { 
     //do something 
    } 

} 

Броски Нерешенные проблемы компиляции:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The method run(float) in the type Demo is not applicable for the arguments (double) 
The method run(float) in the type Demo is not applicable for the arguments (double) 

at test.Demo.main(Demo.java:6) 
+1

Потому что '0.1' является двойным литералом; целое число, умноженное на double, является двойным и т. д. Если вы хотите иметь плавающий литерал, используйте суффикс 'f'. –

ответ

2

Это происходит потому, что, когда суффикс «F» или «d» не указано для десятичного числа, Java автоматически по умолчанию его в два раза.

Поэтому run (0.1);

будет: run (0.1d);

+0

Могу ли я изменить это в Java-проекте? – user6266369

+0

Вы можете попытаться создать перегруженный метод 'run (double x)', опустить значение для float и вызывать 'run (float x)' оттуда, рискуя потерять информацию при литье вниз. В принципе, 'run (0,1)' будет вызывать двойной метод, а затем этот метод будет вызывать метод float. – Vishal

+0

Хотя я лично использовал бы верхний регистр суффикса, если бы просто был симметричным с суффиксом для длинного 'L', что является предпочтительным, потому что' l' запутывает. –

3

Как определено в Java Language Specification:

с плавающей точкой буквальным имеет тип поплавка, если он имеет суффикс с ASCII буквой F или F; в противном случае его тип двойной и необязательно может быть суффиксом с ASCII буквы D или D

Таким образом, вместо литья вы можете дать понять компилятору, что вы на самом деле с помощью литерала типа float с помощью суффикса :

run(0.1f); 
Смежные вопросы