2016-11-19 3 views
3

Как включить значение Byte? Очевидный способ был бы:Включить байт

fun foo(b: Byte): Boolean { 
    return when(b) { 
    0 -> true 
    else -> false 
    } 
} 

но терпит неудачу во время компиляции с

src/ByteSwitch.kt:3:5: error: incompatible types: kotlin.Int and kotlin.Byte 
    0 -> true 
    ^

Есть ли способ сделать это 0 быть байтами буквальными?

ответ

1

Вы не можете указать байтовый литерал в Котлине (nor can you in Java). От Literal Constants - Basic Types - Kotlin Programming Language

Существуют следующие виды литералов для целочисленных значений:

  • Decimals: 123
    • Лонгс помечаются заглавной L: 123L
  • Hexadecimals: 0x0F
  • Бинарные: 0b00001011

Однако вы можете объявить compiler-time constants, чтобы избежать превращения Int в Byte время выполнения:

const val ZERO_BYTE: Byte = 0 

fun foo(b: Byte): Boolean { 
    return when (b) { 
     ZERO_BYTE -> true 
     else -> false 
    } 
} 
3

С Котлин позволяет условия ветвления быть произвольными выражениями (не обязательно константы), один подход должен принять, что 0 будет Int и просто преобразовать его явно в Byte:

fun foo(b: Byte): Boolean { 
    return when(b) { 
    0.toByte() -> true 
    else -> false 
    } 
} 

Per Ilya, «0.toByte() оценивается во время компиляции, поэтому во время исполнения нет затрат на конвертацию».

+0

Как неэффективна это, если я буду делать это в плотной петле? – Cactus

+0

Я бы сказал, что java будет делать то же самое внутри. – elect

+0

Вы можете извлечь '0.toByte()' в локальную переменную для эффективности. Не уверен, что JIT этого не делает уже – voddan

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