2017-09-04 2 views
6

J'ai essayé ce code surcharge méthode et je suis l'erreurMéthode surcharge d'erreur de type incompatible »montre avec flotteur, mais pas avec double

pas de méthode appropriée trouvée pour ajouter (à double, double)

Le code:

class Adder { 
    static float add(float a, float b) { 
     return a + b; 
    } 

    static int add(int a, int b) { 
     return a + b; 
    } 
} 

class TestOverloading1 { 
    public static void main(String[] args){ 
     System.out.println(Adder.add(11.5, 11.5)); 
     System.out.println(Adder.add(27, 21)); 
    } 
} 

sur l'écriture, 11.5f dans params, cela fonctionne bien. J'ai compris les différences entre float et double de here et here. Alors, pourquoi Java prend-il les paramètres comme double type de données par défaut? La plus grande précision du double derrière un tel biais? Je suis conscient qu'il prend le double par défaut. Mais, je souhaite savoir quelle est la raison derrière cela?

+0

parce que 11.5 est un double. vous pouvez également essayer avec: new Float (11.5) – Stultuske

+2

@Stultuske Suggérer des gens à utiliser 'new Float (11.5)' est un mauvais conseil, pourquoi introduire un nouvel objet wrapper, quand utiliser un littéral float fera l'affaire. –

+0

ce n'était pas vraiment un conseil, plus un indice que c'est une façon plus 'visible' de tester si pour un flotteur cela fonctionnerait – Stultuske

Répondre

7

Une virgule flottante littéral sans suffixe (comme 11.5) est de type double par définition (de même un nombre entier littéral sans suffixe est de type int) .

Un paramètre double est inacceptable pour un procédé qui accepte float arguments (depuis une coulée de double à float peut entraîner une perte de données, et par conséquent le compilateur ne sera pas effectuer un tel moulage automatiquement).

D'autre part, 11.5f est un littéral float, vous pouvez donc transmettre ces littéraux à votre méthode add(float a,float b).

4

faire

Adder.add(11.5,11.5) 

est le même que

double a = 11.5; 
double b = 11.5; 
Adder.add(a, b) 

qui ne marche pas correspondre aux paramètres de la méthode statique

static float add(float a,float b){return a+b;} 

vous êtes si nécessaire pour: jeté les littéraux flotteur:

Adder.add(11.5f, 11.5f); 

ou déclarer a et b en tant que flotteur

float a = 11.5; 
float b = 11.5; 
Adder.add(a, b) 
2

"11,5" sans rien est considéré comme double par Java. Vous pouvez utiliser quelque chose comme:

System.out.println(Adder.add(new Float(11.5),new Float(11.5))); 
0

C'est juste une spécification. Juste comme pourquoi int ont la valeur par défaut 0 en Java.

Double est le type par défaut pour les valeurs décimales:

double: Le double type de données est une double précision 64 bits IEEE 754 virgule flottante. Sa plage de valeurs dépasse la portée de cette discussion , mais est spécifiée dans la section Types de virgules flottantes, formats et de la spécification de langage Java. Pour les valeurs décimales, , ce type de données est généralement le paramètre par défaut. Comme mentionné ci-dessus, ce type de données ne doit jamais être utilisé pour des valeurs précises, telles que la monnaie .

Source: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

2

En Java lorsque nous tapons nombre décimal 11,5, il est alors considéré comme double. le double est de 64 bits tandis que le flottement est de 32 bits, donc la conversion n'est pas possible, c'est pourquoi l'exception de compilation se produit. Pour plus d'informations s'il vous plaît visitez: Primitive Data Types