2012-06-16 6 views
5

Próbuję zrozumieć następujący kod:Problemy z parametrów odlewania i krótkich w Javie

public class A { 
    private void doTask() {  
     doInt(99); 
    } 

    public short doInt(short s) { 
     return 100; 
    } 
} 

Kod daje błąd kompilatora on line „doInt (99)”.

The method doInt(short) in the type A is not applicable for the arguments (int) 

Czy ktoś może wyjaśnić, dlaczego daje mi błąd.

+0

Możliwa powielać http://stackoverflow.com/q/5106766/269514, http://stackoverflow.com/q/2294934/269514 – Gilberto

+0

Nowsze duplikat pytanie http://stackoverflow.com/q/ 16505959/269514 – Gilberto

Odpowiedz

4

Spróbuj

public class A { 
    private void doTask() {  
     doInt((short)99); 
    } 

    public short doInt(short s) { 
     return (short)100; 
    } 
} 

Java uważa, że ​​wszystkie literały (takich jak 99 lub 100) w programie jest int.

Jeśli zostanie przekazany duży numer, na przykład 12345678, zostanie on skrócony, aby pasował do wartości short. Java nie może zmniejszyć liczby bez Ciebie, więc musisz to zrobić sam. W ten sposób widzisz, że int odsyłasz krótko:

+0

Przesyłanie od 100 do krótkich nie jest konieczne. Kiedy przypisujesz literał liczbowy do skrótu, a jego wartość mieści się w legalnym zakresie, przyjmuje się, że literał jest krótki. – Xion345

+0

Tak, ale myślałem, że w poprzedniej wersji java musisz to zrobić – alaster

7

W języku java domyślnym typem liczby całkowitej jest int. Java automatycznie upcast (np. Z short do int), ale wyda ostrzeżenie z downcastingiem (np. Z int do short) z powodu możliwej utraty danych.

Poprawkę dotyczącą kodu jest taka:

doInt((short)99); 

Ten wyraźny przygnębiony zmienia 99 (który jest int) do short, więc nie ma (dalszego) możliwość utraty danych.

+0

dzięki bardzo. Nie widzę ostrzeżenia. W rzeczywistości daje błąd kompilatora. – Alan2

1

Musisz odrzucić 99 na krótki. Spróbuj następujące typy danych

public class A { 
    private void doTask() {  
     doInt((short) 99); 
    } 

    public short doInt(short s) { 
     return 100; 
    } 
} 
1

int jest zazwyczaj domyślnym wyborem, chyba że istnieje jakiś powód.

A zatem 99 jest traktowany jako int.

Więcej szczegółów na Primitive Data Types

Trzeba wyraźnie odlew w razie potrzeby.
Zmień doInt(99) na doInt((short) 99) i powinno działać.

1

Główną przyczyną błędu jest

Nie można niejawnie przekonwertować nonliteral typy numeryczne większego rozmiaru pamięci do krótkiej

więc zmienić swój kod do następujących.

public class A { 
    private void doTask() {  
     doInt((short)99); 
    } 

    public short doInt(short s) { 
     return (short)100; 
    } 
} 
+1

short ans = 10; nie daje mi błędu. – Alan2

Powiązane problemy