2015-07-18 3 views
11

Согласно documentation сотворенным класс перечислимуюКак объявить переменную типа перечисления в Kotlin?

enum class BitCount public constructor(val value : Int) 
{ 
    x32(32), 
    x64(64) 
} 

Тогда я пытаюсь объявить переменную в некоторой функции

val bitCount : BitCount = BitCount(32) 

но есть ошибка компиляции

Как объявить переменную типа BitCount и инициализировать ее с Int?

Error:(18, 29) Kotlin: Enum types cannot be instantiated

+0

Кстати, вам не нужно использовать полный синтаксис конструктора для простых случаев, поэтому слово 'constructor' является избыточным. Это может быть сделано только с помощью 'public enum class BitCount (..)' – voddan

+0

Если вы все еще хотите создать экземпляр Enum с заданным числовым значением, вы можете (но больше «найти экземпляр с заданным числовым значением») : http://stackoverflow.com/a/34625163/3679676 –

+0

для новых гостей. прочитайте этот учебник по перечислениям в Котлине. http://developine.com/enum-classes-in-kotlin-example/ –

ответ

8

экземпляры Enum могут быть объявлены только внутри декларации класса enum.

Если вы хотите создать новый BitCount просто добавить его, как показано ниже:

enum class BitCount public constructor(val value : Int) 
{ 
    x16(16), 
    x32(32), 
    x64(64) 
} 

и использовать везде, как BitCount.x16.

+0

«enum class BitCount (значение val: Int)» достаточно, потому что вы не можете создать экземпляр вне enum – D3xter

+0

Я вижу, я думал, что перечисление class constructor позволяет создать экземпляр enum, передав ему соответствующее значение. –

+2

Вот для чего предназначены классы. –

20

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

// wrong, it is a sealed hierarchy, you cannot create random instances 
val bitCount : BitCount = BitCount(32) 

// correct (assuming you add the code below) 
val bitCount = BitCount.from(32) 

Если вы желая найти экземпляр enum на основе числового значения 32, то вы можете сканировать значение следующим образом. Создание enum с companion object и from() функции:

enum class BitCount(val value : Int) 
{ 
    x16(16), 
    x32(32), 
    x64(64); 

    companion object { 
     fun from(findValue: Int): BitCount = BitCount.values().first { it.value == findValue } 
    } 
} 

Затем вызовите функцию, чтобы получить соответствующий существующий экземпляр:

val bits = BitCount.from(32) // results in BitCount.x32 

Приятный и довольно. В качестве альтернативы в этом случае вы можете создать имя значения enum из числа, поскольку у вас есть предсказуемая связь между ними, затем используйте BitCount.valueOf(). Вот новая функция from() внутри объекта-компаньона.

fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue") 
+0

Ницца!Однако можно использовать 'valueOf'; то похоже, что мы перегрузили 'valueOf (String)'. – Raphael

+2

Варианты: 1) 'when' над возможными входами, правильно работающими с' else'. 2) Используйте 'firstOrNull' и сделайте возвращаемое значение' from' опционным. 3) [Предварительная подготовка карты] (http://stackoverflow.com/a/37795810/539599). – Raphael

+0

для новых гостей. прочитайте этот учебник по перечислениям в Котлине. http://developine.com/enum-classes-in-kotlin-example/ –

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