2013-06-18 4 views
5

У меня есть две функции. Один работает отлично, а другой не компилируется. Не в состоянии определить причину. Не могли бы вы помочь мне здесь?Возвращаемые значения в статической функции - Java

Это прекрасно работает

static byte method1() { 
    final short sh1 = 2; 
    return sh1; 
    } 

Это один не компилирует

static byte method2(final short sh2) { 
return sh2; 
} 
+0

Вы должны были разместить сообщение об ошибке компилятора, и вы также должны иметь * прочитать * сообщение об ошибке компилятора и сначала попытаться понять это. – EJP

+0

В компиляторе (infact the editor) четко сказано: я отправил его в байт. Но мой вопрос больше вокруг, как он работает без каста в первой функции, но не во второй. –

ответ

11

В первом примере, sh1 является final, и имеет значение, которое может быть определено во время компиляции будет «кастрированный вниз» к byte. По сути, это постоянная. Если вы удалите final, он больше не будет компилироваться.

В вашем втором примере компилятор не может определить, что аргумент метода является «безопасным», вы должны сделать явное приведение, как упоминалось в других ответах.

Для подробных подробных сведений см. here (ссылки на JLS и все). Но простой пример:

final byte b1 = 127; 
final byte b2 = 1; 
final byte b = b1 + b2; // <-- FAIL: 128 greater than Byte.MAX_VALUE 

final byte b1 = 12; 
final byte b2 = 3; 
final byte b = b1 + b2; // <-- SUCCESS: 15 fits 
+0

Я люблю «кастрированную» аналогию :) –

0

«окончательный» окончательный во время выполнения.

В методе 1

final short sh1 = 2;//// determined value at run-time.So compiles. 

Вы должны бросить it.You проходят короткий и возвращается в качестве байта.

static byte method2(final short sh2) { 

     return (byte) sh2; 

    } 

Is "final" final at runtime?

3

Первый метод:

Первый метод объявляется final short переменной, значение которой 2 внутри диапазона byte. sh1 в этом первом методе не может содержать любое другое значение, отличное от 2, определенное во время самого компиляции. Если вы удалите final, вы увидите жалобу компилятора.

Второй метод:

Вы должны бросить short в byte, как это сужающее преобразование, и вы должны убедить компилятор, что вы делаете это сознательно и знать его последствия, поскольку final short sh2 может иметь любое значение, которое должно или не должно находиться в диапазоне byte.

static byte method2(final short sh2) 
{ 
    return (byte)sh2; 
} 
+0

Да, но почему «кастинг» не требуется для первого? –

0

Java - это строго типизированный язык. В строго типизированных языках вы должны выполнять явное наследование типов. Несоответствие типов данных приведет к ошибкам в строго типизированных языках.

В вашем коде вы проходите short и возвращаетесь byte. Таким образом, код должен быть следующим:

static byte method2(final short sh2) 
{ 
    return (byte) sh2; 
} 
1

Также как эксперимент, если вы удаляете назначение с первого, например.

static byte method1() { 
     final short sh1; 
     return sh1; 
     } 

Тогда это тоже не скомпилируется. Так же, как и второй, компилятор не уверен в безопасности типов, потому что значение передается функции, то же самое происходит, если вы удаляете назначение из первого.

Смежные вопросы